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
由于懒惰评估而存在大型列表的堆栈溢出问题)
我研究了不同的折叠和一般折叠以及其他一些折叠,他们解释得相当好。
我仍然不知道在这种情况下如何工作。
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
由于懒惰评估而存在大型列表的堆栈溢出问题)