Haskell高阶函数计算长度

时间:2012-02-15 16:36:31

标签: haskell higher-order-functions

我无法理解这里发生了什么?任何人都可以解释一下这段代码吗? 该函数如何计算长度?

callength = foldr (\_ n -> 1 + n) 0

为什么它在右下角使用lambda,下划线,下划线和n和零之间的空格?

1 个答案:

答案 0 :(得分:18)

(\_ n -> 1 + n)只是指一个带有两个参数的函数,并返回一个多于第二个参数的函数。下划线仅表示忽略参数。作为比较,作为不使用通配符模式(下划线)的顶级声明,此函数将如下所示:

foo x n = 1 + n

现在,这是一个示例列表:

[1, 2, 3, 4]

这实际上只是语法糖:

1 : 2 : 3 : 4 : []

foldr执行的操作是递归地将每个(:)替换为它给出的函数,[]使用函数后的参数替换{<1>} 。因此,任何foldr f z [1, 2, 3, 4]f的{​​{1}}都是这样的:

z

(这就是f 1 (f 2 (f 3 (f 4 z))) 只返回你给它的同一个列表的原因 - 它最终会重建原始的列表结构。)

在这种情况下,使用函数foldr (:) []和零0,它看起来像:

foo

我们知道foo 1 (foo 2 (foo 3 (foo 4 0))) 忽略它的第一个参数,并且返回比第二个参数多一个的参数。所以这与:

相同
foo

这是4,列表的长度。基本上,fold会忽略列表中的每个元素,只是为每个元素添加一个累加器,给出长度。 0用于结束整个过程,因为空列表的长度为0。

为了更详细地了解这一点,我们可以逐步扩展每个电话:

1 + (1 + (1 + (1 + 0)))