foldr - 进一步的解释和地图功能的例子

foldr - further explanation and example with a map function

我研究了不同的折叠和一般折叠以及其他一些折叠,他们解释得相当好。

我仍然不知道在这种情况下如何工作。

length :: [t] -> Int
length list = foldr (+) 0 (map (\x ->1) list)

有人可以一步一步地解释一下吗?

以及 foldl 如何工作。

(map (\x ->1) list) 获取列表并将其转换为 1 值的列表:

(map (\x ->1) ["a", "b", "c"]) == [1, 1, 1]

现在,如果您在原始文件夹中替换它,它看起来像这样:

foldr (+) 0 [1, 1, 1]

起点是0,聚合函数是(+)。当它遍历列表中的每个元素时,您基本上是将所有 1 值相加,这就是您最终返回长度的方式。

foldr 从右边开始,回到列表的头部。 foldl 从左边开始遍历列表。因为聚合函数是 (+) :: Num a => a -> a -> a,所以 (+) 中左右参数的顺序在逻辑上是无关紧要的(需要注意的是 foldl 由于懒惰评估而存在大型列表的堆栈溢出问题)