1
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」コマンドの説明も非常に役立ちます。

4

1 に答える 1

2

私は ocaml に精通していますが、すべて同じように見えます。

val y=2;
fun f(x) = x*y;

y最初の 2 行は、変数と をバインドしますfy整数2f、整数を取り、xそれを にバインドされているもので乗算する関数y2fしたがって、関数が整数を取り、それを で乗算すると考えることができます2。( f(x) = x*2)

fun g(h) = let val y=5
           in
               3+h(y)
           end;

次の行は、g一部を取りh(整数を取り、整数を返す関数であることが判明します)、次のことを行う関数を定義します。

  1. 整数5を一時変数にバインドしますy
    • let//構文はinend次の式で使用できる一時変数を宣言する方法と考えることができますinend式を終了するだけです。end(これは、が省略されているocaml とは対照的です)
  2. 引数またはを適用3する関数との和を返します。hy5

大まかに言えば、関数gは何らかの関数を受け取り、その関数に適用され、結果5に加算されます。3( g(h) = 3+h(5))

この時点で、3 つの変数が環境にバインドされます: y = 2f = functionおよびg = function

let val y=3
in
    g(f)
end;

3一時変数にバインドされ、関数を引数としてy関数を呼び出します。関数が定義されると、関数と一緒に環境が保持されるため、ここでの一時的なバインディングは関数とに影響を与えないことを覚えておく必要があります。彼らの行動は変わりません。gfygf

g( g(h) = 3+h(5)) は、引数f( f(x) = x*2) で呼び出されます。hパラメータの置換を実行すると、g3+((5)*2)評価され13ます。

これがあなたにとって明らかであることを願っています。

于 2010-10-21T01:35:21.967 に答える