F# 让绑定(bind)模式

标签 f#

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

最佳答案

你在另一个函数中定义了一个函数,你的内部函数 f 从外部函数中获取了一个值,这个值 xx + y 所以 x 变成 4.

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

相关文章:

f# - 为什么 reduce 比 sum 或 sumBy 快?

f# - 如何在F#中编写类似ZipN的函数?

f# - 为什么涉及方法应用程序的连续参数应该用括号括起来?

f# - 如何在没有 "printf"的情况下调用 Seq.whatever 中的函数?

haskell - 是否可以将 F# 记录的标签用作 Haskell 中的函数或类似的函数?

f# - 在异构列表上,是否可以使压缩然后解压缩与原始列表相同?

F# 给函数参数与不给函数有什么区别

architecture - 函数式语言中的架构思维

c# - 如何从线程池中的 C# 程序运行 Main() 方法?

F# optional 记录字段