如何理解伯德和休斯折叠

时间:2014-05-17 04:37:43

标签: functional-programming lambda

试图理解Charles Bird的功能编程简介以及John Hughes' 为什么功能编程很重要。特别是他们对 foldr 的讨论。

length = foldr count 0
count a n = n + 1

如果将此项应用于列表,例如[1,2,3],则应该返回3.此处的鸟类(第66页):

(#) = foldr oneplus 0
       where oneplus x n = 1 + n

另外还有另一种lambda治疗方法:

length = foldr (λx.λn.(1 + n)) 0

一旦我们开始尝试将其应用到像[1,2,3]这样的列表中,我就无法理解这个折叠器的用途。我只是没有看到变量x和n所指的是什么。一个简单的例如:

sum = foldr (+) 0
[1,2,3]的

(+) 1 ((+) 2 ((+) 3 0)) = 6

使用Hughes'替换列表的隐含缺点的函数/运算符和列表的标识隐含的nil,然后(前缀)添加 - 我明白。但在处理这些神秘变量时并非如此。也许有人可以告诉我列表和变量如何相互作用。

1 个答案:

答案 0 :(得分:0)

传递给foldr的函数的参数是被折叠的列表元素和累加器(实际上是正在计算的东西)。

这些参数的更明确的名称可能会有所帮助:

length = foldr count 0
count ignored_elt length_so_far = length_so_far + 1

理解折叠的另一种方法是将它们写为递归函数,并编写折叠,并检查两个定义以查看它们是如何相似的。在其中一些之后,您应该开始了解折叠捕获的模式。 (提示:在执行此操作时,尽量避免像+这样的交换操作,因为它们可能会模糊左右折叠之间的差异。)