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
和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)
)
此时,环境中绑定了三个变量y = 2
:f = function
和g = function
。
let val y=3
in
g(f)
end;
Now3
绑定到一个临时变量y
并g
以该函数f
作为参数调用函数。你需要记住,当一个函数被定义时,它会保留它的环境,所以y
这里的临时绑定对函数g
和f
. 他们的行为没有改变。
g
( g(h) = 3+h(5)
),用参数f
( f(x) = x*2
) 调用。对 parameter 执行替换h
,g
变为3+((5)*2)
which 的计算结果为13
。
我希望这对你来说很清楚。