foldr と foldl ってこんな風に作れるよね。

foldr :: (a -> b -> b) -> b -> [a] -> b
foldr _ i [] = i
foldr f i (x:xs) = f x (foldr f i xs)

foldl :: (b -> a -> b) -> b -> [a] -> b
foldl _ i [] = i
foldl f i (x:xs) = foldl f (f i x) xs

なんで foldl より foldr の方がメモリ効率がいいのか分からん。
どっちも結果の値が評価されるまで式が数珠繋ぎになったままじゃね?