アクティブパターン

アクティブパターンは、 特定の物に複数の見え方を提供するためにあります。 例えば、整数は2の倍数とそれ以外にもわけられますし 正の数と負の数という風にもわけられます。 これをプログラムすると次のようになります。
アクティブパターンを使用した整数のパターンマッチ
let (|ODD|EVEN|) (x:int) =
	if x%2=0 then EVEN else ODD;;
let (|POSITIVE|NEGATIVE|) (x:int) =
	if x>=0 then POSITIVE else NEGATIVE;;

match 10 with
	| POSITIVE -> print_endline "positive"
	| NEGATIVE -> print_endline "negative";;

match 10 with
	| ODD -> print_endline "odd"
	| EVEN -> print_endline "even";;
同じint型の変数に対して 異なった観点でのパターンマッチが出来ていることに 注意してみてください。

デザインガイドが推奨している使い方

上で見たとおり、アクティブパターンは複数の方法で 同じ対象に対するパターンマッチを行えます。 これをある種のカプセル化のように利用する事が出来ます。 F#のデザインガイドのドラフト(2010 august版)(pdf注意)の3.6 Union Typesによると 一般的なガイドとして Discriminated Unionをユーザに公開するのは避けるべきだそうです。 そこで、アクティブパターンの出番です。 内部的な実装はDiscriminated Unionや他のデータ型を使い ユーザに公開するインタフェースをアクティブパターンで提供する という使い方が出来ます。 そのような設計をしておくことで 内部実装を変更したとしても、アクティブパターンでその差を吸収出来るため ユーザコードに影響なくライブラリの変更がしやすくなります。 このテクニックは、F#でのMonadic parser combinator実装である FParsecにも使われています。