リストの畳み込みには、foldr が使われる。 foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ ini [] = ini foldr op ini (x:xs) = x `op` foldr op ini xs Data.List には、この双対となる関数 unfoldr が定義してある。 unfoldr :: (a -> Maybe (b,a)) -> a -> [b] unfoldr f x = case f x of Nothing -> [] Just (z,x') -> z : unfoldr f x' unfoldr は種からリストを生成する。 既存の関数 unfoldr をプリミティブと考えて、他の関数を定義してみる。まずは、iterate。 iterate :: (a -> a) -> a -> [a] iterate f =