「入門Haskell―はじめて学ぶ関数型言語」 p.78 より。
(3) unlines,unwords を intersperse を使って定義しなさい。また使わずに定義しなさい。
まずは使う方から。
myUnlines = (concat . intersperse "\n") myUnwords = (concat . intersperse " ")
結果。
*Main> myUnlines ["abc","def","ghi"] "abc\ndef\nghi" *Main> myUnwords ["abc","def","ghi"] "abc def ghi"
OK……とおもったら,unlines は一番最後にも改行文字が付くのか。
*Main> unlines ["abc","def","ghi"] "abc\ndef\nghi\n"
そしたらこうか。あんまりきれいじゃないなぁ。
myUnlines [] = "" myUnlines list = (concat . intersperse "\n") list ++ "\n"
*Main> myUnlines ["abc","def","ghi"] "abc\ndef\nghi\n"
OK。
intersperse を使わないほう。これは似たようなことを前(cf. id:takatoh:20060413)にやった。
myUnlines2 [] = "" myUnlines2 (x:xs) = x ++ "\n" ++ myUnlines2 xs myUnwords2 [] = "" myUnwords2 (x:[]) = x myUnwords2 (x:xs) = x ++ " " ++ myUnwords2 xs
結果。
*Main> myUnlines2 ["abc","def","ghi"] "abc\ndef\nghi\n" *Main> myUnwords2 ["abc","def","ghi"] "abc def ghi"
こっちはすんなりOK。
myUnlines は一行でも書けます。myUnlines2 は折角なので fold を使ったバージョンも書いてみては。