頻繁にどれがどれだか分からなくなるので、まとめ。
infnite.hs
repeat :: a -> [a]
take 5 $ repeat 3
-- [3,3,3,3,3]
replicate :: Int -> a -> [a]
replicate 5 3
-- [3,3,3,3,3]
cycle :: [a] -> [a]
take 10 $ cycle [1,2]
-- [1,2,1,2,1,2,1,2,1,2]
iterate :: (a -> a) -> a -> [a]
take 5 $ iterate (^2) 2
-- [2,4,16,256,65536]
-
repeat
は単一要素からなる無限リストを生成 -
replicate
はrepeat
の有限版(要素数はInt
) -
cycle
はリストを繰り返しによって無限に拡張する(repeat
のリスト版と思っていい) -
iterate
は前要素に順に関数を適用してリストを生成する
これらは全て初期値からのリスト生成となるのでunfoldr
で実装可能
(もちろん再帰でも書けるが自明なので省略)
上の例をunfoldrで書き換える.hs
-- repeat,replicate
-- replicateはNothingを用いて書くことも可
take 5 $ unfoldr (\x -> Just(x,x)) 3
-- cycle
take 10 . concat $ unfoldr (\xs -> Just(xs,xs)) [1,2]
-- iterate
take 5 $ unfoldr (\x -> Just(x,x^2)) 2
iterate
はx
に関数を適用して次の要素生成に回すが、他もid x
と考えれば同形式となる