要素と要素の間ごとに新しい要素を挟み込む。
join s [] = [] join s (c:cs) = c:s:(join s cs)
実行結果。
*Main> join '-' "abc" "a-b-c-"
あれ?
そうか,一番最後の要素も c:cs にマッチングしてるんだな。てことは”最後の要素”を表すパターンがあればいいのか。これでどうだ。
join s [] = [] join s (c:[]) = c:[] join s (c:cs) = c:s:(join s cs)
実行。
*Main> join '-' "abc" "a-b-c"
OK。
私も昔昔、同じことをやったのを思いだしました。
標準のList(またはData.List)モジュールに
intersperse :: a -> [a] -> [a]
intersperse sep [] = []
intersperse sep [x] = [x]
intersperse sep (x:xs) = x : sep : intersperse sep xs
というのがあったりします。
ほんとだ。Data.List にありますね。href Data.List で一覧を見たんですけど intersperse がどんな関数なんだか想像つきませんでした。英語力の問題か。