ふつうのHaskell - 6章演習

お題は、「受けとったテキストを 60 文字で改行するプログラム」。

いやー、面白かった。仕上がったのは時間ギリギリだったし、気の利いた処理を書いたわけでもないんだけど、やっぱ思ったように動かせるとクるものがあるねぇ。

私的には今日の目玉はコード書きだった。XRにしても、練習問題にしても、誰かとやるのって推進力が強い。

自力版

main = do cs <- getContents
          putStr $ folding cs

folding :: String -> String
folding cs = unlines $ map fold $ lines cs
  where
    fold []              = []
    fold str
      | length str <= 60 = str
      | otherwise        = let (x,xs) = splitAt 60 str
                           in  x ++ ['\n'] ++ fold xs

とにかく覚えたての内容を使うぞ、ということでパターンマッチ、ガード、let、whereを投入。模範解答と比べると、大袈裟な感じ。

模範回答 (ujihisa さん)

その場で提示された模範解答。本についてる方の解答は実はまだ見てなかったりする。

main = interact fold

fold :: String -> String
fold cs = unlines $ concatMap foldOne $ lines cs

foldOne :: String -> [String]
foldOne [] = []
foldOne xs = let (a,b) = splitAt 60 xs
             in a : foldOne b

結構似てる気もするけど、あちこちすっきりしている。一行目の

main = interact fold

main-- putStr.fold =<< getContents

と等価らしいんだけどこの書式自体よくわからない。噂のモナド
私がわかる形だと、こういうことらしい。

main = do cs <- getContents
          putStr $ fold cs