F#let绑定模式

时间:2017-01-11 08:22:34

标签: f#

问题在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成为xy的参数?

2 个答案:

答案 0 :(得分:7)

您正在另一个函数中定义一个函数,您的内部函数f从外部函数中捕获一个值,x中使用的值为x + y所以x变成了4。

然后你调用内部函数f xx传递给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。