Haskell H99 Question 14
http://www.haskell.org/haskellwiki/99_questions/11_to_20
H99 Question 14
日本語訳
リストの要素を重複させなさい。
> dupli [1, 2, 3]
[1,1,2,2,3,3]
これは簡単ですね。
dupli :: [a] -> [a] dupli = concatMap (\x -> ([x,x])) dupli' [] = [] dupli' (x:xs) = x:x:(dupli xs)
模範解答もこんな感じでした。
concatMap便利。Question 12で書いたとおり、中のリスト同士を連結させて、中の要素を外のリストの要素にしてしまうという形。
concatMapを使わないバージョンも作ってみました。すべての要素に対して二個同じものを戻りのリストに入れます。
模範解答
http://www.haskell.org/haskellwiki/99_questions/Solutions/12
面白いのはListモナドを使っているものでしょうか。
dupli xs = xs >>= (\x -> [x,x])
ラムダ式のところは、a -> m a (但し mは[])で、それをすべての引数の要素にapplyするという感じ。基本的な挙動はconcatMapと同じなんですね。
戻りは当然[] aとなります。