Haskell中的内部绑定

时间:2017-02-22 22:05:08

标签: haskell lambda syntax

我是Haskell的新手,而且 我不知道这段代码是如何工作的。任何人都可以在这个例子中向我解释内部绑定如何工作

f = (\x -> ((\x -> x*x) 3)+x)

当我尝试f 1时,我得到10

2 个答案:

答案 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

最后,我们可以将squaref定义为函数,而不是使用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