Midoliy |> F# - アクティブパターン
アクティブパターン
Midoliy|F#プログラミング
アクティブパターンの概要
サンプルでみるアクティブパターン
部分的なアクティブパターン

アクティブパターンの概要


 アクティブパターンを使用すると、入力値を細分化する名前付きパーティションを定義できるため、判別共用体の場合と同じようにmatch式でこれらの名前でマッチングができます。また、アクティブパターンを使用して、パーティションごとにカスタマイズした方法でデータを分解することが可能です。

 以下はアクティブパターンの構文になります。
// ------------------
// [ 構文 ]
// ------------------

// 完全なアクティブパターンの定義方法
let (|identifer1|identifier2|...|) [ arguments ] = expression

// 部分的なアクティブパターンの定義方法
let (|identifier|_|) [ arguments ] = expression
                

 アクティブパターンの識別子(= identifer, 名前付きパーティションとも)は、引数で表される入力値のパーティション名、つまり、引数のすべての値に対するサブセットとなるような別名です。アクティブパターン定義には 最大7つのパーティション を含めることができます。左辺の式(= expression)は、入力値を分解するルールを記述します。この式に基づいて、引数で指定した値がどの識別子に属するかが決定されます。また、識別子は (| |)記号 は「バナナクリップ」と呼ばれ、この型をlet束縛して作成された関数は「アクティブ識別関数(= active recognizer)」と呼ばれます。
 まずは以下の簡単なアクティブパターンのサンプルで、実際の定義から動作までを確認してみてください。



サンプルでみるアクティブパターン


 アクティブパターンは前節のサンプルで紹介したように、「入力値を適切なサブセット名に分類する」ような場面で使われます。しかし、その他にもう一つ、アクティブパターンの用途があります。例えば、同じ基となるデータにさまざまな表現があり、複数の方法でデータ型を分解したい場合にアクティブパターンを利用します。
 System.Drawing.Colorオブジェクトは、RGB表現またはHSB表現に分解することができます。今回はこれを例にサンプルを見ていきます。


 これら2つの使用方法を組み合わせることで、データを適切な形式に分割・分解し、適切なデータに対して適切な計算を、計算に最も適した形式で実行することができます。
 結果として得られるパターンマッチング式は、非常に読みやすい便利な方法でデータを書き込むことを可能にし、潜在的に複雑な分岐および、データ分析コードを大幅に単純化します。最初は難しく感じるかもしれませんが、積極的に利用して使い方に慣れていきましょう。


パーシャルアクティブパターン


 稀に入力値の分割をする際に一部のパーティションにのみマッチングさせたい場合があります。そういった場合、それぞれがいくつかの入力値にマッチングするけれども、ほかの入力には一致しないような「パーシャルアクティブパターン」を作成します。これはすなわち、常に値を生成するとは限らないことを意味しています。
 常に値を生成するとは限らないアクティブパターンのことを、パーシャルアクティブパターン と呼びます。パーシャルアクティブパターンはoption型の戻り値を持ちます。
 パーシャルアクティブパターンを定義するには、バナナクリップ内のパーティションリストの最後にワイルドカード文字(= _)を指定します。次のコードは、パーシャルアクティブパターンの使用方法を示しています。