问题在stackoverflow中并不新鲜,但我无法理解let
与模式和in
关键字绑定的行为。
我的textbook更喜欢不常见的函数定义格式:
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
。为什么?我无法理解函数内部实际发生了什么,即使是here的优雅解释。为什么4
成为x
和y
的参数?
答案 0 :(得分:7)
您正在另一个函数中定义一个函数,您的内部函数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
调用它,它会返回一个期望另一个参数的函数。
答案 1 :(得分:5)
假设我们用4调用函数foo。
let foo x =
let f y =
x + y
f x
foo 4
我们可以将foo 4
替换为foo
函数,将所有x
替换为4。
let f y =
4 + y
f 4
现在我们可以使用f 4
替换f
函数。
y := 4
这显然是8。