ふつける: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 ' '

遅延評価の事を考えると,タブよりも普通の文字の方が多いはずだし,パターンマッチよりもこっちのほうが良いはず.

追記

実は遅かった.コメント欄を参照の事.

これで

これで,ふつけるも第二部*1まで終わりました.第三部*2は,実践Haskellプログラミングと題し,Wikiの作成に入ります.これから先はいちいちブログにまとめるのもアレなんで,気がついた事があったらまとめる,という形にしたいと思います.

*1:戦闘潮流ではない

*2:スターダストクルセイダーズではない