fold
一个
fold
取一个二元函数,一个初始值
(
我喜欢管它叫累加值
)
和一个需要折叠的
List。这个二元函数有两个参数,即累加 值和
List
的首项
(
或尾项
)
,回传值是新的累加值。然后,以新的累加值和新的
List
首项调用该函数,如是继续。到
List 遍历 完毕时,只剩下一个累加值,也就是最终的结果。
foldl做折叠函数
它从
List
的左端开始折叠,用初始值和
List 的头部调用这二元函数,得一新的累加值,并用新的累加值与
List
的下一个元素调用二元函数。如是继续。
(acc指代什么?acc指代初始值(又叫累加值))
sum' :: (Num a) => [a] -> a
sum' xs = foldl (\acc x -> acc + x)
同时这个sum'的写法还可以简化(柯里化):
sum' :: (Num a) => [a] -> a
sum' = foldl (+) 0
又一个例子:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldl (\acc x -> if x == y then True else acc) False ys
foldr右折叠函数
map' :: (a -> b) -> [a] -> [b]
map' f xs = foldr (\x acc -> f x : acc) [] xs
ghci> map' (+3) [1..3]
[6,5,4]