我是Haskell的新手,而且 我不知道这段代码是如何工作的。任何人都可以在这个例子中向我解释内部绑定如何工作:
f = (\x -> ((\x -> x*x) 3)+x)
当我尝试f 1
时,我得到10
答案 0 :(得分:6)
您的代码非常混淆,所以让我们清理它。我们从
开始f = (\x -> ((\x -> x*x) 3)+x)
并注意到有两个变量都被称为x
- 多么令人困惑!所以我们把它写成
f = (\x -> ((\y -> y*y) 3)+x)
接下来,有这个内部lambda表达式。我们可以给它命名并将其绑定在与f
绑定的相同级别:
square = (\y -> y*y)
f = (\x -> (square 3)+x)
此时,我想删除不必要的括号:
square = \y -> y*y
f = \x -> square 3 + x
最后,我们可以将square
和f
定义为函数,而不是使用lambda抽象。同样,这是等效的代码¹:
square y = y*y
f x = square 3 + x
此时,您可能更了解此代码。
¹事实上,编译器可能会在内联时优化两种不同的方式,只有在提供所有 manifest 参数时才会发生,但这是超出了这个问题的范围。
答案 1 :(得分:1)
您可以安全地删除外括号:
f = \x -> ((\x -> x*x) 3) + x
现在,\x -> stuff
构造是一个参数x
的匿名函数。内部函数\x -> x*x
对任何给定的数字进行平方。 (\x -> x*x) 3
调用它,它会为您3 * 3 == 9
。
外部函数首先调用内部函数并将x
添加到结果中。所以,你得到9 + 1 == 10
。
我在这里看不到任何关于绑定的特别之处。函数是独立的,以及变量x
。