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