基本的な構文

7.4 パターンマッチ

データコンストラクタによるパターン

[]と、(x:xs)の「:」がデータコンストラクタであるとのこと。
お馴染みのmap関数に現れる。

map :: (a -> b) -> [a] -> [b]
map f []     = []
map f (x:xs) = f x : map f xs


ちらりと第9章を覗き見したところ、データコンストラクタはこれらだけではない様子。
まぁ、第9章までのお楽しみということで。

「@(アズ)」パターン

これは面白いパターンですね。アズ(as)とは、日本語でいうところの「…として」のアズなんですね。

main = print $ myTrans "@@@@@abc"

myTrans :: String -> String
myTrans str@[]     = []
myTrans str@(c:cs) = if c == '@' then myTrans cs else str

Warningが出ますが、ご勘弁。


strをとしても、strを(c:cs)としてもパターンマッチする、という感じ。
strとしても参照出来るし、
や(c:cs)としても参照出来る。

ガード

何となくですが、Haskellでは関数の中身を評価する前に出来る限り分岐させる方針のようですね。
そのためにパターンマッチやガードがある、という理解です。
この考え方って遅延評価と関係してるのかな?


ありふれた例ですけど、こんな感じ。

main = print $ myFact 5

myFact :: Int -> Int
myFact n
    | n == 1    = 1
    | n > 1     = n * myFact(n - 1)
    | otherwise = undefined


そして、このガードはパターンマッチと組み合わせて使うことが出来る。
関数の中身を評価する前に、何とかして絞り込みたい、という想いが伝わってきますね。