パターンに条件を付加するのがガード。
# 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 がどんな値でもマッチすることになり,警告もでない。