val y=2;
fun f(x) = x*y;
fun g(h) = let val y=5 in 3+h(y) end;
let val y=3 in g(f) end;
行ごとの説明を探しています。私は ML が初めてで、オンライン コードを解読しようとしています。また、「let/in」コマンドの説明も非常に役立ちます。
val y=2;
fun f(x) = x*y;
fun g(h) = let val y=5 in 3+h(y) end;
let val y=3 in g(f) end;
行ごとの説明を探しています。私は ML が初めてで、オンライン コードを解読しようとしています。また、「let/in」コマンドの説明も非常に役立ちます。
私は ocaml に精通していますが、すべて同じように見えます。
val y=2;
fun f(x) = x*y;
y
最初の 2 行は、変数と をバインドしますf
。 y
整数2
とf
、整数を取り、x
それを にバインドされているもので乗算する関数y
に2
。f
したがって、関数が整数を取り、それを で乗算すると考えることができます2
。( f(x) = x*2
)
fun g(h) = let val y=5
in
3+h(y)
end;
次の行は、g
一部を取りh
(整数を取り、整数を返す関数であることが判明します)、次のことを行う関数を定義します。
5
を一時変数にバインドしますy
。
let
//構文はin
、end
次の式で使用できる一時変数を宣言する方法と考えることができますin
。 end
式を終了するだけです。end
(これは、が省略されているocaml とは対照的です)3
する関数との和を返します。h
y
5
大まかに言えば、関数g
は何らかの関数を受け取り、その関数に適用され、結果5
に加算されます。3
( g(h) = 3+h(5)
)
この時点で、3 つの変数が環境にバインドされます: y = 2
、f = function
およびg = function
。
let val y=3
in
g(f)
end;
3
一時変数にバインドされ、関数を引数としてy
関数を呼び出します。関数が定義されると、関数と一緒に環境が保持されるため、ここでの一時的なバインディングは関数とに影響を与えないことを覚えておく必要があります。彼らの行動は変わりません。g
f
y
g
f
g
( g(h) = 3+h(5)
) は、引数f
( f(x) = x*2
) で呼び出されます。h
パラメータの置換を実行すると、g
と3+((5)*2)
評価され13
ます。
これがあなたにとって明らかであることを願っています。