ネットワークを切断してブラウザもメーラも IRC も落とした、 ゆぞさん言うところの「殺伐とした環境」だと作業効率がとてもいいことがわかった。 インターネットに発する煩悩の数は 108 どころではないのだ。
さ、もう一回ネットワーク切ろっと。
(09:51)
where を使えば部分適用なしでも fgrep が書けることに気付いたんだけど、 where で変数共有するのと部分適用じゃ どちらが理解しにくいかは微妙なところですな。 なんとなく、Java な人なら where のが簡単そうな気がするんだけど。
-- where を使う
import System
import List
main = do args <- getArgs
cs <- getContents
putStr $ fgrep (head args) cs
fgrep pattern cs = unlines $ filter match $ lines cs
where
match line = any prefixp $ tails line
prefixp str = pattern `isPrefixOf` str
-- 部分適用を使う
import System
import List
main = do args <- getArgs
cs <- getContents
putStr $ fgrep (head args) cs
fgrep pattern cs = unlines $ filter (match pattern) $ lines cs
match pattern line = any (pattern `isPrefixOf`) $ tails line
うーん、部分適用があると関数合成も使いたくなってしまうな……。
ちなみに最終的にはこうなる。
-- 最終版
import System
import List
main :: IO ()
main = do args <- getArgs
case args of
[pattern] -> putStr . fgrep pattern =<< getContents
_ -> error "wrong argument"
fgrep :: String -> String -> String
fgrep pattern = unlines . filter (match pattern) . lines
match :: String -> String -> Bool
match pattern = any (pattern `isPrefixOf`) . tails
(10:21)
http://www.vector.co.jp/magazine/softnews/060107/n0601076.html
プログラム名がナイスすぎる。
(13:36)