试图理解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,然后(前缀)添加 - 我明白。但在处理这些神秘变量时并非如此。也许有人可以告诉我列表和变量如何相互作用。
答案 0 :(得分:0)
传递给foldr
的函数的参数是被折叠的列表元素和累加器(实际上是正在计算的东西)。
这些参数的更明确的名称可能会有所帮助:
length = foldr count 0
count ignored_elt length_so_far = length_so_far + 1
理解折叠的另一种方法是将它们写为递归函数,并编写折叠,并检查两个定义以查看它们是如何相似的。在其中一些之后,您应该开始了解折叠捕获的模式。 (提示:在执行此操作时,尽量避免像+
这样的交换操作,因为它们可能会模糊左右折叠之间的差异。)