コメントでの私の口論は耐えられない、私はsclvがあなたの質問の最初の部分に答えると思いますが、
すべてのHaskellタイプにbottomではなくパターン一致可能なJavanullのような値が含まれている場合、どのような有用なプロパティが失われますか?
言い換えれば、null値を持つすべての型を持ち上げて、すべてのHaskell関数を合計するのが賢明ではないのはなぜですか?
ここでは、非終了と例外を区別しているように見えます。したがって、(停止問題のために)非終了でパターンマッチングを行うことは不可能ですが、例外でパターンマッチングを行うことができないのはなぜですか?
私は自分自身の質問で答えます:例外を決してスローしない関数はどうですか?結局のところ、Haskellには総合的な機能があります。例外的でないことがわかっている場合は、例外的でないことを確認するためにパターンマッチングを行う必要はありません。束縛と規律の言語であるHaskellは、当然、このタイプの違いを伝えたいと思うでしょう。おそらく書くことによって
Integer
例外ではないことがわかっている整数のタイプと
?Integer
代わりに例外となる可能性のある整数のタイプ。答えは、すでにこれを行っているということです。Haskellには前奏曲にタイプがあります
data Maybe a = Just a | Nothing
a
これは「まったくまたはまったくない」と読むことができます。Maybe
この提案では何も得られないように、パターンマッチングを行うことができます。(またEither
、より豊富な種類の「うまくいかない可能性のある計算」のようなタイプや、これらを簡単に操作できるようにするための派手なモナド構文/コンビネータもあります)。
では、なぜ例外があるのでしょうか。Haskellでは、IOモナドを除いて例外を「キャッチ」することはできません。で例外を完全にシミュレートできるとしたらMaybe
、Either
なぜその言語で例外があるのでしょうか。
これにはいくつかの答えがありますが、核心はHaskellの例外が不正確であるということです。プログラムのメモリが不足したり、実行していたスレッドが別のスレッドによって強制終了されたり、その他の予測できない理由でホスト全体が停止したりすると、例外が発生する可能性があります。さらに、一般的に例外を除いて、どの例外が発生するかを気にします。では、次の式はどうなるでしょうか?
(error "error 1") + (error "error 2") :: Integer
この式は明らかに例外になるはずですが、どの例外ですか? (+)
整数に特化することは両方の引数で厳密であるため、それは役に立ちません。それが最初の値であると判断することもできましたが、一般的には
x + y =/= y + x
これは、等式推論のオプションを制限します。Haskellは、不正確な振る舞いを伴う例外の概念を提供します。言語の純粋な部分は完全に正確な振る舞いを持ち、それが制限される可能性があるため、これは重要です。