Una soluzione generica consiste nell'introdurre un nuovo tipo. Può essere più coinvolto, ma ha il vantaggio di lavorare per qualsiasi tipo che non definisce il proprio infinito.
Se T
è un tipo per il quale lteq
è definito, è possibile definire InfiniteOr<T>
con lteq
qualcosa del genere:
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())
Lascio a te tradurre questo per l'esatta sintassi Java. Spero che le idee siano chiare; ma lasciami precisare comunque.
L'idea è di creare un nuovo tipo che abbia tutti gli stessi valori di un tipo già esistente, oltre a un valore speciale che, per quanto si può dire attraverso metodi pubblici, agisce esattamente come si desidera che l'infinito agisca, ad esempio è maggiore di qualunque altra cosa. Sto usando null
per rappresentare l'infinito qui, dal momento che sembra il più semplice in Java.
Se si desidera aggiungere operazioni aritmetiche, decidere cosa devono fare, quindi implementarlo. Probabilmente è più semplice se prima gestisci gli infiniti casi, quindi riutilizza le operazioni esistenti su valori finiti del tipo originale.
Potrebbe esserci o meno un modello generale per stabilire se sia utile o meno adottare una convenzione di gestione degli infiniti sul lato sinistro prima degli infiniti sul lato destro o viceversa; Non posso dirlo senza provarlo, ma per meno-o-uguale ( lteq
) penso che sia più semplice guardare prima l'infinito sul lato destro. Noto che nonlteq
è commutativo, ma e lo è; forse è rilevante.add
mul
Nota: trovare una buona definizione di ciò che dovrebbe accadere su valori infiniti non è sempre facile. È per confronto, addizione e moltiplicazione, ma forse non per sottrazione. Inoltre, esiste una distinzione tra infiniti numeri cardinali e ordinali ai quali potresti voler prestare attenzione.