一般的な解決策は、新しいタイプを導入することです。もっと複雑かもしれませんが、それはそれ自身の無限大を定義しないあらゆるタイプのために働くという利点があります。
が定義さT
れているタイプの場合、次のようにlteq
定義できます。InfiniteOr<T>
lteq
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())
これを正確なJava構文に変換するのは、あなたにお任せします。アイデアが明確であることを願っています。とにかくそれらを綴ってみましょう。
アイデアは、既存のいくつかの型とすべて同じ値を持つ新しい型を作成することです。さらに、パブリックメソッドを通じて確認できる限り、無限に機能させたい方法で機能する特別な値を1つ追加します。他に何か。null
ここでは、無限大を表すために使用しています。これは、Javaで最も簡単に思えるからです。
算術演算を追加する場合は、それらの演算を決定してから実装します。最初に無限のケースを処理し、次に元の型の有限値で既存の操作を再利用するのがおそらく最も簡単です。
右側の無限大の前に左側の無限大を処理する、またはその逆を処理するという慣例を採用することが有益かどうかには、一般的なパターンがある場合とない場合があります。試してみないとわからないが、以下(lteq
)については、最初に右側の無限大を見る方が簡単だと思う。私はそれが注意lteq
されていない可換が、add
とmul
しています。多分それは関連しています。
注:無限値で何が起こるかを適切に定義することは、必ずしも容易ではありません。比較、加算、乗算用ですが、減算ではない可能性があります。また、注意が必要な無限の基数と序数には違いがあります。