実はパーシャルアクティブパターンはパターンマッチ用の入力データの他に、式をカスタマイズするための引数も受け取るようにすることが可能です。このようなアクティブパターンをパラメタライズドアクティブパターンと呼びます。
-------------------------------------------- let (|アクティブパターン識別子|_|) [ 式カスタマイズ用引数 ] [ 入力データ用引数 ] = 式 --------------------------------------------
//アクティブパターン
let (|Contain|_|) (l : string) (n : string) =
if (n.Contains(l)) then Some(true)
else None
//パターンマッチ
let testContain x y = //※1
match x with
| Contain y true -> printfn "%s contains %s" x y //※2
| _ -> printfn "Substring not found"
testContain "Testest" "test" ;; ※3
▼
Testest contains test val ( |Contain|_| ) : string -> string -> bool option val testContain : string -> string -> unit
testContai(n※1)は1つ目の引数として入力データを受け取り、2つ目の引数として、アクティブパターンで式をカスタマイズするために使用する値を受け取ります。アクティブパターンContainは1つ目の引数として式をカスタマイズするための値lを受け取り、2つ目の引数nは入力データとなります。nがlを含むとき、入力データはContainに分類され、trueを戻します。
パターンマッチでパターンの後ろに引数を記述する際(※2)には、1番最後がアクティブパターンからの戻り値用変数を記述します。
※3にて、testContainに渡された1つ目の引数”Testest”は入力データとなり、2つ目の引数”test”はアクティブパターンにて式をカスタマイズするために使われます。
まとめ
今回は、アクティブパターンを利用する方法について学びました。次回は言語指向プログラミングのcomputation representationについて解説します。
