Real World Haskell にはこんなコードが載ってます。 myFoldl :: (a -> b -> a) -> a -> [b] -> a myFoldl f z xs = foldr step id xs z where step x g a = g (f a x) Real World Haskell p100 4.6.8 右からの畳み込み foldl は foldr を使って書けるという例です。 こんな風にほとんどのリスト処理は再帰を使わなくても foldr を使えば書けるらしい*1ので、どこまでできるのか確認するために Prelude にある Data.List の関数を再定義してみました。 ルールは、 再定義した関数は直接的または間接的に再帰していてはならない(foldr は除く) 再帰しないで作った関数を他の関数で使うのは OK 再定義した関数は元の関数と同じ計算