generated at
foldl
定義
1.hs
foldl :: (a -> b -> a) -> a -> [b] -> a foldl f e [] = e foldl f e (x:xs) = foldl f (f e x) xs


fold left
hs
1 : (2 : (3 : []))) -- 通常のリスト (((0 + 1) + 2) + 3) -- foldl (+) 0 [1,2,3]


使用例
hs
sum' :: [Int] -> Int sum' xs = foldl (+) 0 xs

関連





Foldable型クラスのmethodとしての定義
1.hs より一般化されているmrsekut
hs
foldl :: (a -> b -> a) -> a -> t b -> a foldl f z t = appEndo (getDual (foldMap (Dual . Endo . flip f) t)) z
foldrの定義と見比べてみると、いくつか余分なものを加えた形に見える
hs
foldr :: (a -> b -> b) -> b -> t a -> b foldr f z t = appEndo (foldMap (Endo . f) t) z
グレーの部分を取り除くと、foldrになる
>「foldrとfoldlの間にある双対定理」と「Dual型によって定義されるmappendの双対」の二つの双対が使われています
もっかい読みたいmrsekut



リストから数値や逆順のリストを出力する関数と相性が良い ref
パフォーマンス的に
例えば、sumとかlengthとかreverseとか
reverseは配列生成じゃんmrsekut
末尾再帰である
foldl' f (f e x) xs () の部分が先に計算され、
「末尾の処理」は foldl' f ■ xs となっているため、これは末尾再帰


パフォーマンスの話
foldl'との関係
定義にseq関数が使われている?
だから正格評価になっている?
hackage見た感じ、そんな感じはしないけど


foldlはこわれているのでなおす
基本的に foldl ではなく、 foldl' を使うという話もある