repeat,cycle,iterate

repeat,cycle,iterateでrepeat,cycle,iterateを定義してみる

--repで定義したrep
rep     x = x : rep x
--cycで定義したrep
rep_cyc x = cyc [x]
--iterで定義したrep
rep_iter  = iter id

--cycで定義したcyc
cyc xs   = xs ++ cyc xs
--repで定義したcyc
cyc_rep  = concat . rep
--iterで定義したcyc
cyc_iter = concat . iter id

--iterで定義したiter
iter     f x = x : map f (iter f x)
--repで定義したiter
iter_rep f   = foldr (\y r->f y : map f r) [] . rep
--cycで定義したiter
iter_cyc f x = foldr (\y r->f y : map f r) [] $ cyc [x]

うーん、iter_repとiter_cycがなんか大げさになってしまった。もっときれいな解法があるのかな…