Ocaml / Haskellのどこで対みましょう

OcamlとHaskellの言語はISWIM言語の子孫であり、PeterLendinによる有名な記事「次の700のプログラミング言語」で説明されています。その中で、著者はLISP言語から始めて、新しいプログラミング言語を作成し、特に、MLファミリーの言語で広く使用されているキーワードlet



and



紹介しwhere



ます。遅かれ早かれ、関数型プログラミングに携わる好奇心旺盛な人は疑問を抱きwhere



ます。Haskellで広く使われているキーワードがOcamlに根付いいないのはなぜですか?





私の見解では、これは主にこれらの言語のセマンティクスの違い、つまりOcamlの命令型エネルギーの性質と、Haskellでの評価の純粋な怠惰(不純な/純粋な文字に直接かつ強く関連している)によるものです。これらの言語の)。





これらの式の両方、let



およびはwhere



、由来している (let ...)



。この特別な形式の二つの変種がありLISP言語、:(let ...)



(let* ...)



バリアント(let* ...)



は、ブロック内のすべてのバインディングが順番に発生し、相互に依存する可能性があるという点で異なります。





(let* ((x 3)

        (y (+ x 2))

        (z (+ x y 5)))

       (* x z))








スキームの一部の方言では、変数宣言はインタープリターによって自動的に並べ替えられるため、「正しい」順序で記述する必要がなくなります。どちらの結合のためのオプション、let ... in



およびwhere



この「高度」オプションに対応(let* ...)



ただし、Ocamlはキーワードを使用して「並列バインディング」を分離しますがand



、Haskellは単にそれらを1つのブロックに配置します。





物事の本質だけを見ると、バインディングが配置される場所とブロック内の式の数という2つの側面でlet ... in



where



が異なることがわかります。





使用前後の名前のバインド。

- let ... in



, , where



:





let x = 1 in

 x + 1








z = x + 1

 where x = 1








, let ... in Ocaml, , , / . ,





let x = Printf.printf "Hello ";

         "World!"

 in

 Printf.printf "%s" x








. top-level Ocaml, , open



let () = ...







, where non-strict Haskell, term/graph reduction. , where



, :





main = putStrLn (x ++ y)

        where x = "Hello "

              y = "World!"

              z = undefined








: x



y



, . z



, - .





x



, y



, z



let ... in



, Haskell, - z



, . , do



, let



.





shadowing

C let ... in



, Ocaml, Haskell, . where



- :





let x = 1 in

 let y = 1 in

 x + y








z = x + y

 where x = 1

       y = 1








, , , , , , "shadowing". Ocaml shadowing , :





let x = 1 in

 let x = x * 10 in

 x * x








, , :





x := 1;

 x := x * 10;

 return x*x;








Haskell, where



, "", shadowing , . shadowing , top-level , - non-strict . , Haskell





x = x + 1







.





shadowing Ocaml Haskell , Ocaml , Ocaml Haskell (backpack , - t



M



Ocaml ).





Ocaml , -, (.mli) (.ml). , , -, , top-level , . - , Ocaml top-level , . , let ... in (., report_constructor_mismatch https://github.com/ocaml/ocaml/blob/trunk/typing/includecore.ml#L212 )





Haskell , . , , - , , top-level . , where shadowing.





, , - Clean.





, , where



, let ... in



"-", , . , , , Haskell , Ocaml .





, Ocaml, Stdlib



where , , , . , List.mapi



List.rev_map



. , , Ocaml , , - graph rewriting . , Ocaml where



, , Haskell let ... in



.





したがって、優れたエンジニアリング作業のように、Ocaml言語とHaskell言語は構文とセマンティクスの相乗効果を生み出します。ガイドラインlet



拘束しwhere



線形psevdoimperativnuyuと「怠惰な」(グラフ還元)パフォーマンスモデルを強調することを強調して、役割を果たします。また、好みのアプリケーションの記述スタイルや関連するモジュールシステムでもうまく機能します。








All Articles