LoginSignup
4
4

More than 5 years have passed since last update.

[JavaプログラマのためのHaskell]五日目・パターンマッチの話

Posted at

前回の続き.

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.

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4