Concurrent Clean : パターンマッチとガード

Types and Programming Languages (The MIT Press)のP.47あたりで、こんな関数定義があって、

let rec isval t = match t with
    TmTrue(_)  -> true
  | TmFalse(_) -> true
  | t when isnumerical t  -> true
  | _ -> false

"when"って便利そうなキーワードだなーとかとぼけっと考えていたら、Cleanではもっと簡潔に書けるのだったということを思い出した。
で、走り書きしたテストコード。

g t = case t of
    A a | a > 0 = True
    B _         = True
    A a         = isEven(a)
    _           = False

パターンマッチとガードを混ぜてはいけないとはどこにも書いていなかったのに、なんとなく別のものだと思い込んでいたみたい。