Genel bir çözüm yeni bir tür tanıtmaktır. Daha fazla dahil olabilir, ancak kendi sonsuzluğunu tanımlamayan herhangi bir tür için çalışma avantajına sahiptir.
Eğer T
bir türüdür lteq
tanımlanır, tanımlayabilirsiniz InfiniteOr<T>
ile lteq
böyle bir şey:
class InfiniteOr with type parameter T:
field the_T of type null-or-an-actual-T
isInfinite()
return this.the_T == null
getFinite():
assert(!isInfinite());
return this.the_T
lteq(that)
if that.isInfinite()
return true
if this.isInfinite()
return false
return this.getFinite().lteq(that.getFinite())
Bunu tam Java sözdizimine çevirmek için size bırakacağım. Umarım fikirler açıktır; ama onları heceleyelim.
Fikir, halihazırda mevcut olan bazı türlerle aynı değerlere ve ayrıca genel yöntemlerle anlayabildiğiniz kadarıyla - tam olarak sonsuzluğun hareket etmesini istediğiniz şekilde hareket eden özel bir değere sahip yeni bir tür oluşturmaktır. başka herhangi bir şey. Ben null
burada sonsuzluğu temsil etmek için kullanıyorum , çünkü bu Java'da en basit görünüyor.
Aritmetik işlemler eklemek istiyorsanız, ne yapmaları gerektiğine karar verin, ardından uygulayın. Öncelikle sonsuz vakaları ele alırsanız, ardından mevcut işlemleri orijinal türün sonlu değerleri üzerinde yeniden kullanırsanız muhtemelen en basit olanıdır.
Sağ taraftaki sonsuzluklardan önce sol taraftaki sonsuzlukların ele alınmasına ilişkin bir sözleşmenin benimsenmesinin faydalı olup olmadığı konusunda genel bir kalıp olabilir veya olmayabilir; Denemeden söyleyemem, ama eşit veya daha az ( lteq
) için önce sağ taraftaki sonsuzluğa bakmak daha kolay olduğunu düşünüyorum. Ben dikkat lteq
olduğunu değil değişmeli ama add
ve mul
vardır; belki de alakalı.
Not: Sonsuz değerlerde ne olması gerektiğinin iyi bir tanımını bulmak her zaman kolay değildir. Karşılaştırma, toplama ve çarpma içindir, ama belki çıkarma değildir. Ayrıca, dikkat etmek isteyebileceğiniz sonsuz kardinal ve sıra sayıları arasında bir ayrım vardır.