F#让绑定模式

Wor*_*ice 3 f#

这个问题在stackoverflow中并不新鲜,但我无法理解let与模式和in关键字绑定的行为.我的教科书更喜欢不常见的函数定义格式:

let foo = fun x -> let f = (fun x y -> x +y ) in f x    
Run Code Online (Sandbox Code Playgroud)

所以我翻译了#light语法:

let foo x =
    let f y =
        x + y
    f x
Run Code Online (Sandbox Code Playgroud)

如果我设置foo 4它返回我8.为什么?我无法理解函数内部实际发生了什么,即使这里有优雅的解释.为什么4成为双方争论xy

Gus*_*Gus 7

你正在另一个函数中定义一个函数,你的内部函数f从外部函数中捕获一个值x,x + y因此使用的值x变为4.

然后你调用f x传递xy4 的内部函数.

另一种查看它的方法,没有考虑具体的值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
Run Code Online (Sandbox Code Playgroud)

现在,如果你用foo 4它调用它,则返回一个期望另一个参数的函数.


Cod*_*key 5

假设我们用4调用函数foo.

let foo x =
    let f y =
        x + y
    f x

foo 4
Run Code Online (Sandbox Code Playgroud)

我们可以用4 替换所有的foo 4功能foo替换x.

let f y =
    4 + y

f 4
Run Code Online (Sandbox Code Playgroud)

现在,我们可以替换f 4使用功能fy := 4.

4 + 4
Run Code Online (Sandbox Code Playgroud)

这显然是8.