ガード付きマッチング節

パターンに条件を付加するのがガード。

# let abs' = function
0 -> 0
| n when n > 0 -> n
| n -> (-1) * n
;;
val abs' : int -> int = <fun>

2番目の when n > 0 がガード。パターンは3番目と同じだけどここで条件分けをしている。3番目のパターンは条件が付いていないので残りの場合(n < 0 の場合)にマッチする。

# abs' (-1);;
- : int = 1
# abs' 8;;
- : int = 8
# abs 0;;
- : int = 0

3番目のパターンにもガードをつけると警告がでる。

# let abs'' = function
0 -> 0
| n when n > 0 -> n
| n when n < 0 -> (-1) * n
;;
Characters 12-82:
Warning P: this pattern-matching is not exhaustive.
Here is an example of a value that is not matched:
1
(However, some guarded clause may match this value.)
............function
0 -> 0
| n when n > 0 -> n
| n when n < 0 -> (-1) * n
val abs'' : int -> int = <fun>

パターンマッチングが網羅的でないといっている。要するにどのパターンにもマッチしない可能性があるというわけだ。

これは, when の条件は false に可能性がある,という見積もりをするせい。そのため,上に書いたような警告がでる。最初のコードでは3番目のパターンには条件が付いていないから,n がどんな値でもマッチすることになり,警告もでない。