むずかしめのパソコン勉強の記録

計算機科学とか関数型言語とか

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となります。