ふつける:11章練習問題
ふつける11章の練習問題を解きます.
2章で作ったhead.hsを(>>=)を使って
main = getContents >>= putStr . unlines . take 10 . lines
面倒いんで関数とか作りませんでした.
2章で作ったtail.hsを(>>=)を使って
main = getContents >>= putStr . lastNLines 10 lastNLines :: Int -> String -> String lastNLines = (. lines) . (unlines .). takeLast takeLast :: Int -> [String] -> [String] takeLast = (. reverse) . (reverse .). take
わざlastNLinesの引数を2にして動作を試してたら,何故かうまく行かなかったのでなんでだろうと思ってたら,Linuxのtailをそのまま実行していたと言う.
あ,それとこの関数結合の方法は以前にb2oxさんに教えてもらったものなんですが,
= (. reverse) (reverse . take n) = (. reverse) (((reverse .). take) n)
の変形は
- a b c = (a b) c
- f (g x) = (f . g) x
を使っているって事で良いんでしょうか.
3章のexpand.hs ver.2を(>>=)を使って
expand.hsは,タブを空行に換えるってヤツでしたっけ.
tabStop = 8 main = getContents >>= putStr . expand expand :: String -> String expand = concatMap expandTab expandTab :: Char -> String expandTab c = if c /= '\t' then [c] else replicate tabStop ' '
遅延評価の事を考えると,タブよりも普通の文字の方が多いはずだし,パターンマッチよりもこっちのほうが良いはず.
追記
実は遅かった.コメント欄を参照の事.