当我在Haskell学习foldr
函数时,我遇到了这个程序,我无法弄清楚它是如何执行的。
mylength :: [Int] -> Int
mylength l = foldr f 0 l
where
f x y = y + 1
答案 0 :(得分:2)
当您使用数字列表调用此函数时,将执行此功能。 myLength [1,2,3]
应该返回3
。
foldr
有三个参数。第一个是函数:这里是f
。第二个是起始值,与您希望整个事物返回的类型相同。最后一个参数是你要折叠的列表。
foldr
像这样工作(有点):函数f
将被调用列表的每个元素,最后一个元素。第一次,它被称为列表的最后一个元素0
,返回1
。然后使用列表中倒数第二个元素和1
(前一个调用的结果)调用它。所以每次f
的结果是到目前为止列表的长度。当列表中没有任何内容时,它将返回到目前为止累积的值(列表的长度)。
一个很好的练习是尝试使用递归定义自己编写折叠。这可能有助于您更好地理解它。