基本的な構文

7.4 パターンマッチ

「_」パターン

ちょっと分かりにくいけど、変数を束縛しない、というところがポイントですね。
こんな感じ。

myIf :: Bool -> a -> a -> a
myIf True  t _ = t
myIf False _ e = e


引数を参照しない場合は「_」を使った方が、読み手にとっては楽になりますね。

リテラルパターン

これも今まで出てきていたパターンですね。こんな感じになります。

div :: Int -> Int -> Fractional
div _ 0 = 0
div x y = x / y


リテラル0でパターンマッチしてます。

タプルパターン

これも既出パターンですけど、タプルの各要素に対してもパターンマッチを指定出来るんですね。
こんな感じかなぁ。

max :: (Int, Int) -> Int
max (x, y) = if x > y then x else y

min :: (Int, Int) -> Int
min (x, y) = if x > y then y else x


もしかしたら、こんなことも出来るのかな?

main = print $ myMax (5, 5)

myMax :: (Int, Int) -> Int
myMax (x, x) = 0
myMax (x, y) = if x > y then x else y
% ghc -o myMax -W myMax.hs

myMax.hs:4:7:
    Conflicting definitions for `x'
    In the definition of `myMax'


ありゃりゃ、ダメなんですね。変数xが衝突しているとのこと。

リストパターン

なるほど、リストの中の一つ一つの要素に対してパターンマッチ出来るんですね。
でも不思議なことに[]はリストパターンではないとのこと。
(x:xs)はリストパターンじゃないのは何とな〜く分かるんですけどね。