練習問題(つづき)

入門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。