ふつける:7章読んだ

読みました.7章は「基本的な構文」.コメントとか,レイアウトとか.友達は「早くね?」とか言いますけど,もともと少しHaskellを触ってから読み始めてるので,新しく覚える事が少ないから,理解にかかる時間が短くて済み,結果ハイペースに見えるだけ.完全に理解できてるか?と言われると疑問符が,ですが.
それでは,いつも通り,練習問題を解きます.

標準入力から読んだ各行を幅60バイトに収まるように折り返すコマンドfoldを書け

単語境界,マルチバイト文字は考えなくて良いとのこと.さて,一行60バイトのファイルとか探すのが面倒なんで,幅10とかにしておきますよ.


とりあえず簡単に.

main = do cs <- getContents
          putStr $ unlines $ concatMap (fold 10) $ lines cs

fold :: Int -> String -> [String]
fold _ [] = []
fold n cs = let (fs,sn) = splitAt n cs in fs : fold n sn

let (fs,sn) = splitAt n csの部分が結構すき.パターン束縛ってやつ?


ただ,この状態だとconcatMap (fold 10)の部分がそんなに綺麗に見えないので,

putStr $ unlines $ fold 10 $ lines cs

にします.この方が汎用性が高そうだ.

fold :: Int -> [String] -> [String]
fold = concatMap.foldLine

foldLine :: Int -> String -> [String]
foldLine _ [] = []
foldLine n cs = let (fs,sn) = splitAt n cs in fs : foldLine n sn

しれっと関数結合.8章風に言うと,ポイントフリースタイル.アイキャンダンス*1
折角where節の説明があるのでfoldLineはwhere節に放り込んでしまうのも有りなのかな.

*1:何人がこのネタに付いて来れるか