这个问题在stackoverflow 中不是新问题,但我无法理解 let
与模式和 in
关键字绑定(bind)的行为。
我的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
的参数?
最佳答案
你在另一个函数中定义了一个函数,你的内部函数 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
。
所以这解释了你的函数使用简单语法的行为,但你可能想知道为什么它与单行版本不同。因为翻译错了。这是正确的翻译:
let foo x =
let f x y =
x + y
f x
现在,如果您使用 foo 4
调用它,它会返回一个需要其他参数的函数。
关于F# 让绑定(bind)模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41585858/