我无法理解这里发生了什么?任何人都可以解释一下这段代码吗? 该函数如何计算长度?
callength = foldr (\_ n -> 1 + n) 0
为什么它在右下角使用lambda,下划线,下划线和n和零之间的空格?
答案 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)))