foldl
定義
1.hsfoldl :: (a -> b -> a) -> a -> [b] -> a
foldl f e [] = e
foldl f e (x:xs) = foldl f (f e x) xs
fold left
hs1 : (2 : (3 : []))) -- 通常のリスト
(((0 + 1) + 2) + 3) -- foldl (+) 0 [1,2,3]
使用例
hssum' :: [Int] -> Int
sum' xs = foldl (+) 0 xs
関連
1.hs
より一般化されている

hsfoldl :: (a -> b -> a) -> a -> t b -> a
foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z
foldrの定義と見比べてみると、いくつか余分なものを加えた形に見える
hsfoldr :: (a -> b -> b) -> b -> t a -> b
foldr f z t = appEndo (foldMap (Endo . f) t) z
>「foldrとfoldlの間にある双対定理」と「Dual型によって定義されるmappendの双対」の二つの双対が使われています
もっかい読みたい

リストから数値や逆順のリストを出力する関数と相性が良い
refパフォーマンス的に
例えば、sumとかlengthとかreverseとか
reverseは配列生成じゃん

foldl' f (f e x) xs
の ()
の部分が先に計算され、
「末尾の処理」は foldl' f ■ xs
となっているため、これは末尾再帰
パフォーマンスの話
だから正格評価になっている?
foldlはこわれているのでなおす
基本的に foldl
ではなく、 foldl'
を使うという話もある