6.6 パターン

6.6.1. 変数パターン
6.6.2. 定数パターン
6.6.3. alias パターン
6.6.4. 括弧つきのパターン
6.6.5. or パターン
6.6.6. バリアントパターン
6.6.7. 多相バリアントパターン
6.6.8. バリアント略記パターン
6.6.9. タプルパターン
6.6.10. レコードパターン
6.6.11. 配列パターン
pattern ::= value-name
| _
| constant
| pattern as value-name
| ( pattern )
| ( pattern : typexpr )
| pattern | pattern
| constr pattern
| ` tag-name pattern
| # typeconstr-name
| pattern { , pattern }
| { field = pattern { ; field = pattern } }
| [ pattern { ; pattern } ]
| pattern :: pattern
| [| pattern { ; pattern } |]
| lazy pattern

下の表は、閉じてないパターン構文の場合の演算子の結合性と優先順位を示しています。 優先度が高いものが先に来ます。

演算子結合性
構成子の適用-
::
,--
as-

パターンは、与えられた形のデータ構造を選択し、データ構造の要素を識別子に束縛します。この選択操作をパターンマッチングと呼びます。処理結果は「この値は、このパターンにはマッチしない」 か、「この値はこのパターンにマッチするから、ある名前をその値に束縛する」のどちらかになります。

6.6.1 変数パターン

変数名から成るパターンは全ての値にマッチし、その値にその名前を束縛します。 パターン _ も全ての値にマッチしますが、名前を束縛しません。

パターンは線形です。すなわち、同一の変数がパターンに複数回現れることは出来ません。特に、パターンのみを使ってデータ構造間の等価性を検査することは出来ません(そのためには when 使います)。

6.6.2 定数パターン

定数からなるパターンは、値がこの定数に等しいときにマッチします。

6.6.3 alias パターン

パターン pattern1 as value-name は、 pattern1 と同じ値にマッチします。 pattern1 にマッチした場合、 pattern1 に対するマッチングによる束縛に加えて、名前 value-name にもマッチした値が束縛されます。

6.6.4 括弧つきのパターン

パターン ( pattern1 ) は、 pattern と同じ値にマッチします。 括弧つきのパターンには、 ( pattern1 : typexpr ) の様に型制約をつける事が出来ます。 この型制約は ( pattern1 )typexpr と互換性があることを強制します。

6.6.5 or パターン

パターン pattern1 | pattern2 は、二つのパターン pattern1pattern2 の論理和を表します。 値が、 pattern1 | pattern2 にマッチするとは、 pattern1 にマッチするか、 pattern2 にマッチすることを言います。 二つのサブパターン pattern1pattern2 は、同じ型を持つ値を示す、全く同じ識別子を束縛しなければなりません。

(旧) ``or'' パターンに対するマッチングによる束縛は、 まず pattern1 によるマッチングによって束縛されるか、 pattern2 によるマッチングによって束縛されるかのどちらかです。 両方が成功した場合は、どちらの束縛が選択されるかは未定義です。

マッチングは左から右に行なわれます。 より正確に言うと、ある値 vpattern1 | pattern2 にマッチするとき、 vpattern1 にマッチするときは pattern1 による束縛が行なわれ、そうでなければ vpattern2 にマッチし、 pattern2 によって束縛が行われます。

6.6.6 バリアントパターン

パターン constr pattern1 は、構成子が constr と等しく、引数が pattern1 にマッチする任意のバリアントにマッチします。

パターン pattern1 :: pattern は、頭部が pattern1 にマッチし、尾部が pattern2 にマッチする、空でないリストにマッチします。

パターン [ pattern1 ; ... ; patternn ] は長さが n で、要素が順に、 pattern1 ... patternn にマッチするリストにマッチします。 このパターンは pattern1 :: ... :: patternn :: [] と同じように振舞います。

6.6.7 多相バリアントパターン

パターン ` tag-name pattern1 はタグが tag-name に等しく、引数が pattern1 にマッチするすべての多相バリアントにマッチします。

6.6.8 バリアント略記パターン

( 'a , 'b , ...) typeconstr = [ ` tag-name1 typexpr1 | ... | ` tag-namen typexprn ] が定義されているとき、パターン # typeconstr は or パターン ( ` tag-name1 ( _ : typexpr1 ) | ... | ` tag-namen ( _ : typexprn ) ) の略記法になります。 このパターンは型が # typeconstr であるすべての値にマッチします。

6.6.9 タプルパターン

パターン pattern1 , ... , patternn は要素が各々 pattern1 から patternn までにマッチする n 要素のタプルにマッチします。 すなわち、このパターンはタプル値 (v1, ..., vn) について i = 1, ..., n なる vipatterni にマッチするようなタプルにマッチします。

6.6.10 レコードパターン

パターン { field1 = pattern1 ; ... ; fieldn = patternn } は、少なくとも field1 から fieldn を定義したレコードで、 i = 1, ..., n なる fieldipatternn にマッチするような値であるとき、このパターンにマッチする。 レコード値は field1, ..., fieldn 以外の値も定義していてもかまいません。 ただし、そのようなフィールドに対応する値はマッチングでは無視されます。

6.6.11 配列パターン

[| pattern1 ; ... ; patternn |] 長さ n の配列で、 i = 1, ..., n なる i について、配列の i 番目の要素が patterni にマッチするような配列にマッチします。