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;

前两行绑定变量yf. y到一个整数2f一个函数,该函数接受一个整数x并将其乘以绑定到y,的内容2。所以你可以认为该函数f需要一些整数并将其乘以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加上h应用参数的函数的总和y,或5

在高层次上,该函数g采用一些函数,应用于5该函数并添加3到结果中。( g(h) = 3+h(5))

此时,环境中绑定了三个变量y = 2f = functiong = function

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

Now3绑定到一个临时变量yg以该函数f作为参数调用函数。你需要记住,当一个函数被定义时,它会保留它的环境,所以y这里的临时绑定对函数gf. 他们的行为没有改变。

g( g(h) = 3+h(5)),用参数f( f(x) = x*2) 调用。对 parameter 执行替换hg变为3+((5)*2)which 的计算结果为13

我希望这对你来说很清楚。

于 2010-10-21T01:35:21.967 回答