p191の練習問題です。
ひどいコードだけど晒してみる(*ノノ)
fold_length = 60
main = do cs <- getContents
putStr $ unlines $ concat $ map mysplit $ lines cs
mysplit :: String -> [String]
mysplit cs = mysplit_sub $ splitAt fold_length cs
where
mysplit_sub :: (String,String) -> [String]
mysplit_sub (a,b)
| null b = [a]
| length b > fold_length =
a : (mysplit_sub $ splitAt fold_length b)
| otherwise = [a,b]
作り終えたあと、巻末の回答を確認。・・・うわ、めっさエレガントなコードが。caseの使用が思いつかなかったので、mysplit関数とmysplit_sub関数を作っていますが、caseを使えばひとつにまとめられるわけか。
余談ですけど、第4章の回答を確認したところ、第4章時点では紹介されていない「関数合成」を使った回答例が載っていた。これってどうかなぁ・・・。本を最初から読みつつ、理解度チェックのために課題をやっているわけだから、いくらシンプルなコードになるといえ、回答としてはNGだと思う。自分なりに考えに考えて出した答えがベストにどれだけ近い形に出来たのか、それを確認したいのに・・・。