top page > computer > haskell > web_lecture > for_programmer > pattern_match.html
更新日:
文責: 重城良国

パターンマッチ

条件分岐

Haskellの条件分岐の基本はパターンマッチだ。if文もパターンマッチから導ける。

パターンマッチとは

パターンマッチはHaskellの中心的な要素のひとつだ。

[パターンマッチの図]

値がパターンにマッチするかで処理を分岐させ構成的なデータから値をとりだす。

仮引数はパターンだ

xxcrypt n ed mc = mc ^ ed `mod` n

=の左側のn, ed, mcのような仮引数は「パターン」だ。

もっとパターンらしく

よりパターンマッチらしいのはMaybe値だ。Just 8は「失敗の可能性のある関数が適用され、結果は成功で値は8だった」という意味だ。値8を使うにはMaybe値からとりだす。

fun (Just x) = [xを使った演算]

Just xというパターンは

する。Just xはNothingにマッチしないのでfun Nothingはエラーとなる。Nothingの定義を追加する。

fun (Just x) = [xを使った演算]
fun Nothing = [Nothingだった場合に返す値]

ワイルドカード

Just xにマッチしない値はNothingだけだ。パターンNothingでは束縛される変数もない。何にでもマッチし変数束縛を行わないワイルドカードを使おう。

fun (Just x) = ...
fun _ = ...

ワイルドカードは_(アンダースコア)だ。変数束縛のない変数パターンだ。

数や文字もパターン

数などのリテラルもパターンだ。Nothingのように値自体にマッチし何も束縛しない。0の場合にはNothingをそうでなければ逆数を求める関数だ。

safeRecip.hs

safeRecip 0 = Nothing
safeRecip x = Just (1 / x)

safeRecipを適用すると引数と0とのマッチングが試される。マッチすればNothingだ。マッチしなければ引数は0ではない。1 / xは安全だ。返り値はJust値だ。

% ghci safeRecip.hs
*Main> safeRecip 8
Just 0.125
*Main> safeRecip 0
Nothing

文字列リテラルもパターンだ。"Yoshikuni"だけに丁寧に挨拶させる。自分の名前におきかえて楽しもう。(++)は文字列連結演算子と考えておく。

helloTo.hs

helloTo "Yoshikuni" = "Good morning, sir."
helloTo n = "Hello, " ++ n ++ "!"

% ghci helloTo.hs
*Main> helloTo "Yoshikuni"
"Good morning, sir."
*Main> helloTo "Ichiro"
"Hello, Ichiro!"

文字リテラルもパターンだ。引数が数字ならその数を、そうでなかったら-1を返す。

digit.hs

digit '0' = 0
digit '1' = 1
digit '2' = 2
digit '3' = 3
digit '4' = 4
digit '5' = 5
digit '6' = 6
digit '7' = 7
digit '8' = 8
digit '9' = 9
digit _ = -1

まとめ

課題

  1. Just [名前]ならば"[名前] is my friend."を、Nothingなら"I'm alone."を返す関数friendを定義せよ
  2. 引数が0ならばNothingをそうでなければJust [引数]を返す関数notZeroを定義せよ

「Maybe型」へもどる 「ガード」へ

正当なCSSです! HTML5 Powered with CSS3 / styling, and Semantics