この記事 on denotational semantics in haskellによると、すべての型には底があり、型 A の底を型 B の底にマップする場合 、関数 f:A->B は正格であり、それ以外の場合は非正格と呼ばれます。
(これは、射が基点を保持する先のとがったカテゴリを連想させます)。
Haskell には厳密でない関数があるのに、標準 ML にはないのはなぜですか?
この記事 on denotational semantics in haskellによると、すべての型には底があり、型 A の底を型 B の底にマップする場合 、関数 f:A->B は正格であり、それ以外の場合は非正格と呼ばれます。
(これは、射が基点を保持する先のとがったカテゴリを連想させます)。
Haskell には厳密でない関数があるのに、標準 ML にはないのはなぜですか?
再帰を伴うすべてのプログラミング言語には、少なくとも1つの非正格関数があり、多くの場合、条件付き(if-then-else
)の形式になっています。それ以外の場合、すべての再帰はボトム(非終了)を示します。非厳密な関数は必須ですが、これらの言語のほとんどでは、独自の関数を定義することはできません。一部の言語は、マクロ(値の代わりに構文を変換する機能のようなメカニズム)を提供することで、この制限を補います。
Haskell には厳密でない関数があるのに、標準 ML にはないのはなぜですか?
Haskell には非正格関数 (通常は遅延関数) があります。これは、持つと便利なプログラミング機能であるためです。
これらは等式推論を改善し、コードの作成を容易にし、より多くの種類のプログラムを作成できるようにします。
Simon Peyton-Jonesは、彼のスライドセット、Wearing the Hair Shirtで、これに対していくつかの良い反応を示しました。
怠惰はとても便利です
再帰的な値は非常に便利です
怠惰はあなたを正直に保ちます[純度に関して]
最後の理由は私にとって最も重要です。Haskellの計算の純度と効果の厳密な制御は、主にその非厳密性によるものです。
すべての値による呼び出し言語は、副作用のサイレン呼び出しに与えています
プログラマーはCのようなコードを書きたいと思っています。これは、ほとんどの言語で魅力的な「サイレンコール」だと思います。Haskellでは、効果をウィリーニリーにインターリーブすることは意味がありません。厳密でないということは、効果がいつ実行されるかわからないことを意味するからです。
Haskell には厳密でない関数があるのに、標準 ML にはないのはなぜですか?
なぜなら、Haskell の式は Weak Head Normal Form で評価されるのに対し、Standard ML の式は Normal Form で評価されるからです。
次に、Haskell では、標準 ML では評価されていないサンクを使用して推論できます。
ただし、遅延を標準 ML に追加できることを知っておく必要があります。(たとえば、ocamlでそれを行うことができます)
Haskell のデフォルトでの遅延は設計上の選択であり、デフォルトで遅延を処理するコンパイラを作成すると、関数型プログラミングの理解が向上し、研究コミュニティが一歩前進できるという信念を反映している可能性があります。