Una solución genérica es introducir un nuevo tipo. Puede estar más involucrado, pero tiene la ventaja de trabajar para cualquier tipo que no defina su propio infinito.
Si T
es un tipo para el que lteq
está definido, puede definirlo InfiniteOr<T>
con lteq
algo como esto:
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())
Dejaré que traduzca esto a la sintaxis exacta de Java. Espero que las ideas sean claras; pero déjame deletrearlos de todos modos.
La idea es crear un nuevo tipo que tenga todos los mismos valores que algunos tipos ya existentes, más un valor especial que, por lo que puede ver a través de métodos públicos, actúa exactamente de la manera en que desea que actúe el infinito, por ejemplo, es mayor que Algo más. Estoy usando null
para representar el infinito aquí, ya que eso parece lo más sencillo en Java.
Si desea agregar operaciones aritméticas, decida qué deben hacer, luego implemente eso. Probablemente sea más simple si maneja los casos infinitos primero y luego reutiliza las operaciones existentes en valores finitos del tipo original.
Puede haber o no un patrón general para determinar si es beneficioso o no adoptar una convención para manejar los infinitos del lado izquierdo antes que los infinitos del lado derecho o viceversa; No puedo decirlo sin probarlo, pero para menos que o igual ( lteq
) creo que es más simple mirar primero el infinito del lado derecho. Tomo nota de que lteq
es no conmutativo, pero add
y mul
son; Quizás eso sea relevante.
Nota: proponer una buena definición de lo que debería suceder en valores infinitos no siempre es fácil. Es para comparación, suma y multiplicación, pero tal vez no para resta. Además, hay una distinción entre los números cardinales y ordinales infinitos a los que puede prestar atención.