ガード付きマッチング節

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

 # 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 がどんな値でもマッチすることになり,警告もでない。