基本的な構文
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)はリストパターンじゃないのは何とな〜く分かるんですけどね。