RWH 4.5.8 文字列専用の関数

import Data.Char (isSpace)

myLines :: String -> [String]
myLines [] = []
myLines cs =
    let (pre, suf) = myBreak (\c -> c == '\n') cs
    in pre : case suf of
        ('\n':rest) -> myLines rest
        _           -> []

myUnlines :: [String] -> String
myUnlines [] = "\n"
myUnlines (x:xs)
    | not $ null xs = x `myPlusPlus` "\n" `myPlusPlus` myUnlines xs
    | otherwise     = x `myPlusPlus` "\n"

myWords :: String -> [String]
myWords "" = []
myWords cs =
    let (pre, suf) = myBreak isSpace cs
    in pre : myWords (myDropWhile isSpace suf)

myUnwords :: [String] -> String
myUnwords [] = ""
myUnwords (x:[]) = x
myUnwords (x:xs) =  x `myPlusPlus` " " `myPlusPlus` myUnwords xs

myLinesは4.3のsplitLinesを参考に。そろそろかなりエレガントでない書き方になってる。えれふぁんとー