関数型言語というと「ループじゃなくて再帰」というイメージが強くて,実際自分も最初の頃はそう思い込んでいたけど, 実際には fold 等の高階関数を使うほうが多いよという話と,それに関連して foldl と foldr の違いの話. Prelude に様々なリスト操作関数が定義されてるが,その多くは fold さえあれば自分で再帰しなくても書ける. map f = foldr ((:) . f) [] (++) = flip (foldr (:)) filter f = foldr (\a b -> if f a then a:b else b) [] length = foldr (const (+1)) 0 reverse = foldl (flip (:)) [] and = foldr (&&) True or = foldr (||) False all f = foldr ((&