fgrep

import System
import List

main = do args <- getArgs
          cs <- getContents
          putStr $ fgrep (head args) cs

fgrep :: String -> String -> String
fgrep pattern cs = unlines $ filter match $ lines cs
  where
    match :: String -> Bool
    match line = any prefixp $ tails line

    prefixp :: String -> Bool
    prefixp line = pattern `isPrefixOf` line
  • where
    • スコープをある式だけに制限した定義を導入する
    • where節の外側の変数・仮引数を参照できる
  • 「``」による中置演算子
    • xs `isPrefixOf` ys = isPrefixOf xs ys


: head xs , tail xs , filter f xs , any f xs
: List.tails xs , List.isPrefixOf xs ys