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