前回の続き.
expand.hsその3
タブ文字を空白8文字に展開する.
expand.hs
tabStop = 8
main = do cs <- getContents
putStr $ expand cs
expand :: String -> String
expand cs = concatMap expandTab cs
expandTab :: Char -> String
expandTab '\t' = replicate tabStop ' '
expandTab c = [c]
・パターンマッチ: 関数の引数に値のパターンを指定し、それによって場合分けする手法.上記の例では、expandTabは引数が'\t'の時だけ,replicate tabStop ' 'という定義を使用する.expandTabをパターンマッチを使わずに書くと以下.
expandTab c = if c == '\t' then replicate tabStop ' '
else [c]
・concatMap関数: concat関数とmap関数を一つにまとめた関数.分けて書くと、
concat $ mapとなる.
concatMap :: (a -> [b]) -> [a] -> [b]
・replicate関数: replicate n xとした時、xをn個だけ含むリストを返す.nが0以下の時は空のリストを返す.
replicate :: Int -> a -> [a]
replicate 3 True → [True, True True]
replicate 3 77 → [77, 77, 77]
replicate 3 a → "aaa"
replicate 0 True → []
map関数
定義は以下.
map :: (a -> b) -> [a] -> [b]
map f [] → []
map f (x:xs) → f x : map f xs
リストに対するパターンマッチです.第二引数が空リストであれば[]を返し、それ以外であればリストの全要素にfを適用する.
今回はここまで!
第四回
出典
青木峰郎.ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門.ソフトバンク クリエイティブ株式会社,2006,372p.