[英]F# let binding patterns
这个问题在stackoverflow中并不新鲜,但我无法理解let
与模式和in
关键字绑定的行为。 我的教科书更喜欢不常见的函数定义格式:
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
。 为什么? 我无法理解函数内部实际发生了什么,即使这里有优雅的解释。 为什么4
成为x
和y
参数?
你在另一个函数中定义一个函数,你的内部函数f
从外部函数中捕获一个值,在x + y
使用的值x
使得x
变为4。
然后你调用内部函数fx
将x
传递给y
,它也是4。
另一种查看它的方法,没有考虑具体的值4,你的内部函数是let fy = x + y
但是它总是用x
调用,所以y
变成x
,那么你的函数变成let fa = a + a
。
理解这一点的关键是函数可以从上下文中捕获值,在本例中为x
。
因此,这解释了使用light语法的函数的行为,但您可能想知道为什么它与单行版本不同。 这是因为翻译错了。 这是正确的翻译:
let foo x =
let f x y =
x + y
f x
现在如果你用foo 4
调用它,它会返回一个期望另一个参数的函数。
假设我们用4调用函数foo。
let foo x =
let f y =
x + y
f x
foo 4
我们可以用函数foo
替换foo 4
,将所有x
替换为4。
let f y =
4 + y
f 4
现在我们可以用函数f
替换f 4
,其中y := 4
。
4 + 4
这显然是8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.