6

Haskellの表示的意味論(http://en.wikibooks.org/wiki/Haskell/Denotational_semantics)について読んでいますが、あるタイプで、下部の「値」が「通常」とは異なるレベルに配置されている理由がわかりません。値、たとえば、パターンを一致させることができない理由。

ボトムは非終了の計算も示すため、パターンパッチのボトムは問題を引き起こすと思いますが、なぜ非終了の計算とエラーを同じように扱う必要があるのでしょうか。(サポートされていない引数を使用して部分関数を呼び出すと、エラーと見なされる可能性があると想定しています)。

すべてのHaskellタイプにbottomではなくパターン一致可能なJavanullのような値が含まれている場合、どのような有用なプロパティが失われますか?

言い換えれば、null値を持つすべての型を持ち上げて、すべてのHaskell関数を合計するのが賢明ではないのはなぜですか?

(非終了の計算には特別なタイプが必要ですか?)

4

2 に答える 2

17

言語のチューリング完全性を制限せずに非終了を取り除くことはできません。また、停止の問題により、通常、非終了を検出して値に置き換えることはできません。

したがって、すべてのチューリング完全言語には底があります。

HaskellとJavaの唯一の違いは、Javaにはボトムヌルがあるということです。Haskellには後者がありません。nullをチェックする必要がないので便利です。

言い換えれば、ボトムは避けられないので(チューリング完全な世界では)、バグを招くことを除いて、すべてをヌル可能にすることのポイントは何ですか?

また、プレリュードの一部の関数は歴史的な理由で部分的ですが、現代のHaskellスタイルは、ほぼすべての場所で関数全体を記述し、そうでなければ部分的であるMaybeような関数で明示的な戻り型を使用することに傾いています。head

于 2013-02-03T21:01:30.893 に答える
14

コメントでの私の口論は耐えられない、私はsclvがあなたの質問の最初の部分に答えると思いますが、

すべてのHaskellタイプにbottomではなくパターン一致可能なJavanullのような値が含まれている場合、どのような有用なプロパティが失われますか?

言い換えれば、null値を持つすべての型を持ち上げて、すべてのHaskell関数を合計するのが賢明ではないのはなぜですか?

ここでは、非終了と例外を区別しているように見えます。したがって、(停止問題のために)非終了でパターンマッチングを行うことは不可能ですが、例外でパターンマッチングを行うことができないのはなぜですか?

私は自分自身の質問で答えます:例外を決してスローしない関数はどうですか?結局のところ、Haskellには総合的な機能があります。例外的でないことがわかっている場合は、例外的でないことを確認するためにパターンマッチングを行う必要はありません。束縛と規律の言語であるHaskellは、当然、このタイプの違いを伝えたいと思うでしょう。おそらく書くことによって

Integer

例外ではないことがわかっている整数のタイプと

?Integer

代わりに例外となる可能性のある整数のタイプ。答えは、すでにこれを行っているということです。Haskellには前奏曲にタイプがあります

data Maybe a = Just a | Nothing

aこれは「まったくまたはまったくない」と読むことができます。Maybeこの提案では何も得られないように、パターンマッチングを行うことができます。(またEither、より豊富な種類の「うまくいかない可能性のある計算」のようなタイプや、これらを簡単に操作できるようにするための派手なモナド構文/コンビネータもあります)。

では、なぜ例外があるのでしょうか。Haskellでは、IOモナドを除いて例外を「キャッチ」することはできません。で例外を完全にシミュレートできるとしたらMaybeEitherなぜその言語で例外があるのでしょうか。

これにはいくつかの答えがありますが、核心はHaskellの例外が不正確であるということです。プログラムのメモリが不足したり、実行していたスレッドが別のスレッドによって強制終了されたり、その他の予測できない理由でホスト全体が停止したりすると、例外が発生する可能性があります。さらに、一般的に例外を除いて、どの例外が発生するかを気にします。では、次の式はどうなるでしょうか?

(error "error 1") + (error "error 2") :: Integer

この式は明らかに例外になるはずですが、どの例外ですか? (+)整数に特化することは両方の引数で厳密であるため、それは役に立ちません。それが最初の値であると判断することもできましたが、一般的には

x + y =/= y + x

これは、等式推論のオプションを制限します。Haskellは、不正確な振る舞いを伴う例外の概念を提供します。言語の純粋な部分は完全に正確な振る舞いを持ち、それが制限される可能性があるため、これは重要です。

于 2013-02-04T02:46:43.050 に答える