这个问题在stackoverflow中并不新鲜,但我无法理解let
与模式和in
关键字绑定的行为.我的教科书更喜欢不常见的函数定义格式:
let foo = fun x -> let f = (fun x y -> x +y ) in f x
所以我翻译了#light语法:
let foo x = let f y = x + y f x
如果我设置foo 4
它返回我8
.为什么?我无法理解函数内部实际发生了什么,即使这里有优雅的解释.为什么4
成为双方争论x
和y
?
你正在另一个函数中定义一个函数,你的内部函数f
从外部函数中捕获一个值x
,x + y
因此使用的值x
变为4.
然后你调用f x
传递x
到y
4 的内部函数.
另一种查看它的方法,没有考虑具体的值4,你的内部函数是,let f y = x + y
但它总是被调用,x
所以y
变成了x
,然后你的函数就变成了类似的东西let f a = a + a
.
理解这一点的关键是在这种情况下,函数可以从上下文中捕获值x
.
因此,这解释了使用light语法的函数的行为,但您可能想知道为什么它与单行版本不同.这是因为翻译错了.这是正确的翻译:
let foo x = let f x y = x + y f x
现在,如果你用foo 4
它调用它,则返回一个期望另一个参数的函数.
假设我们用4调用函数foo.
let foo x = let f y = x + y f x foo 4
我们可以用4 替换所有的foo 4
功能foo
替换x
.
let f y = 4 + y f 4
现在,我们可以替换f 4
使用功能f
与y := 4
.
4 + 4
这显然是8.