Ogólnym rozwiązaniem jest wprowadzenie nowego typu. Może być bardziej zaangażowany, ale ma tę zaletę, że działa dla każdego typu, który nie definiuje własnej nieskończoności.
Jeśli T
jest to typ, dla którego lteq
jest zdefiniowana, można określić InfiniteOr<T>
z lteq
czymś takim:
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())
Tobie pozostawiam przetłumaczenie tego na dokładną składnię Java. Mam nadzieję, że pomysły są jasne; ale mimo wszystko pozwól mi je przeliterować.
Chodzi o to, aby stworzyć nowy typ, który ma wszystkie te same wartości, co jakiś już istniejący typ, plus jedną specjalną wartość, która - o ile możesz to stwierdzić za pomocą metod publicznych - działa dokładnie tak, jak chcesz, aby działała nieskończoność, np. Jest większa niż coś jeszcze. Używam null
tutaj do reprezentowania nieskończoności, ponieważ wydaje się to najprostsze w Javie.
Jeśli chcesz dodać operacje arytmetyczne, zdecyduj, co mają zrobić, a następnie zaimplementuj to. Prawdopodobnie najprościej jest, jeśli najpierw zajmiesz się nieskończonymi przypadkami, a następnie ponownie użyjesz istniejących operacji na skończonych wartościach oryginalnego typu.
Może istnieć ogólny wzorzec wskazujący, czy korzystne jest przyjęcie konwencji traktowania lewostronnych nieskończoności przed prawostronnymi lub odwrotnie; Nie mogę tego stwierdzić bez wypróbowania tego, ale w przypadku mniej niż lub równych ( lteq
) myślę, że łatwiej jest najpierw spojrzeć na nieskończoność po prawej stronie. Zauważam, że nielteq
jest to przemienne, ale add
i mul
są; może to ma znaczenie.
Uwaga: wymyślenie dobrej definicji tego, co powinno się dziać z nieskończonymi wartościami, nie zawsze jest łatwe. Służy do porównywania, dodawania i mnożenia, ale może nie do odejmowania. Istnieje również rozróżnienie między nieskończonymi liczbami głównymi i porządkowymi, na które warto zwrócić uwagę.