ふつうの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