Functional programming 如何理解伯德和休斯福尔德

Functional programming 如何理解伯德和休斯福尔德,functional-programming,lambda,Functional Programming,Lambda,试图理解Charles Bird对函数式编程的介绍以及John Hughes为什么函数式编程很重要时迷失了方向。特别是他们对foldr的讨论 length = foldr count 0 count a n = n + 1 当这应用于一个列表时,比如说[1,2,3],它应该返回3。这是伯德(第66页): 这是另一种更为lambda的治疗方法: length = foldr (λx.λn.(1 + n)) 0 一旦我们开始尝试将这个foldr应用到像[1,2,3]这样的列表中,我就无法理解它到

试图理解Charles Bird对函数式编程的介绍以及John Hughes为什么函数式编程很重要时迷失了方向。特别是他们对foldr的讨论

length = foldr count 0
count a n = n + 1
当这应用于一个列表时,比如说[1,2,3],它应该返回3。这是伯德(第66页):

这是另一种更为lambda的治疗方法:

length = foldr (λx.λn.(1 + n)) 0
一旦我们开始尝试将这个foldr应用到像[1,2,3]这样的列表中,我就无法理解它到底发生了什么。我只是不明白变量x和n指的是什么。一个简单的例子,如sum:

sum = foldr (+) 0
因为[1,2,3]是

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

使用Hughes的表示法,将列表的隐含cons替换为函数/运算符,并使用列表的隐含nil的标识,然后(前缀)添加——我理解。但在处理这些神秘的变数时就不是了。也许有人可以教我列表和变量是如何相互作用的。

传递给
foldr
的函数的参数是列表的一个元素和累加器(本质上是计算的对象)

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

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

理解折叠的另一种方法是将它们作为递归函数编写,也编写折叠,并检查这两个定义以了解它们的相似性。在做了几次之后,您应该开始了解折叠捕获的模式。(提示:这样做时,尽量避免像
+
这样的交换操作,因为它们会掩盖左右折叠之间的差异)。

Hughes的解释擅长强调递归。是的,我认为n是一个递增变量。但我认为这是一个必要的伎俩。我不明白的是n变量的lambda计算方面。在lambda函数中,x是绑定变量,n是什么?有人能告诉我递归如何寻找lambda函数吗?比如[1,2,3],我不知道你的意思。在
λx中。λn。1+n
x
n
都是参数(这是两个参数函数的lambda演算等价物)。除了存在
foldr
所暗示的递归之外,没有递归。如果我按照Hughes所说的去做,我会在计数中进行细分,即(1+n)表示列表中的Cons。对于[1,2,3]我们有Cons 1(Cons 2(Cons 3 Nil))变成(n+1)1((n+1)2((n+1)3 0)…这是什么?我仍然不明白n是什么以及它来自哪里。@LawrenceBottorff你不是用
1+n
代替Cons,你用函数
λx.λn.1+n
length = foldr count 0
count ignored_elt length_so_far = length_so_far + 1