myUnlines と myUnlines2

昨日の IO () さんからの宿題の回答。といっても myInits と myTails のほうはまだ解決してない。とりあえずわかったのから。
cf. id:takatoh:20060513:exercise2


まずは myUnlines を1行で書くことから。これはリストの最後に空文字列をつけてやればいい。

 myUnlines list = (concat . intersperse "\n") $ list ++ [""]
 *Main> myUnlines ["abc","def","ghi"]
 "abc\ndef\nghi\n"
 *Main> myUnlines []
 ""

さらに,セクションにして合成してやれば引数も消せる。

 myUnlines = (concat . intersperse "\n") . (++ [""])


じゃあ,次は fold を使って myUnlines2。foldr で右からつないでいけばいい。

 myUnlines2 = foldr (\a b -> a ++ "\n" ++ b) ""
 *Main> myUnlines2 ["abc","def","ghi"]
 "abc\ndef\nghi\n"
 *Main> myUnlines2 []
 ""

無名関数の引数を消すこともできる。

 myUnlines2 = foldr ((++) . (++ "\n")) ""

けどかえって分かりにくいかな。