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 | - |
パターンは、与えられた形のデータ構造を選択し、データ構造の要素を識別子に束縛します。この選択操作をパターンマッチングと呼びます。処理結果は「この値は、このパターンにはマッチしない」 か、「この値はこのパターンにマッチするから、ある名前をその値に束縛する」のどちらかになります。
変数名から成るパターンは全ての値にマッチし、その値にその名前を束縛します。 パターン _ も全ての値にマッチしますが、名前を束縛しません。
パターンは線形です。すなわち、同一の変数がパターンに複数回現れることは出来ません。特に、パターンのみを使ってデータ構造間の等価性を検査することは出来ません(そのためには when 使います)。
パターン pattern1 as value-name は、 pattern1 と同じ値にマッチします。 pattern1 にマッチした場合、 pattern1 に対するマッチングによる束縛に加えて、名前 value-name にもマッチした値が束縛されます。
パターン ( pattern1 ) は、 pattern と同じ値にマッチします。 括弧つきのパターンには、 ( pattern1 : typexpr ) の様に型制約をつける事が出来ます。 この型制約は ( pattern1 ) が typexpr と互換性があることを強制します。
パターン pattern1 | pattern2 は、二つのパターン pattern1 と pattern2 の論理和を表します。 値が、 pattern1 | pattern2 にマッチするとは、 pattern1 にマッチするか、 pattern2 にマッチすることを言います。 二つのサブパターン pattern1 と pattern2 は、同じ型を持つ値を示す、全く同じ識別子を束縛しなければなりません。
(旧) ``or'' パターンに対するマッチングによる束縛は、 まず pattern1 によるマッチングによって束縛されるか、 pattern2 によるマッチングによって束縛されるかのどちらかです。 両方が成功した場合は、どちらの束縛が選択されるかは未定義です。
マッチングは左から右に行なわれます。
より正確に言うと、ある値 v
が
pattern1 | pattern2
にマッチするとき、
v
が
pattern1
にマッチするときは
pattern1
による束縛が行なわれ、そうでなければ v
は
pattern2
にマッチし、
pattern2
によって束縛が行われます。
パターン constr pattern1 は、構成子が constr と等しく、引数が pattern1 にマッチする任意のバリアントにマッチします。
パターン pattern1 :: pattern は、頭部が pattern1 にマッチし、尾部が pattern2 にマッチする、空でないリストにマッチします。
パターン
[ pattern1 ; ... ; patternn
]
は長さが n
で、要素が順に、
pattern1
...
patternn
にマッチするリストにマッチします。
このパターンは
pattern1 :: ... :: patternn
:: []
と同じように振舞います。
型
(
'a , 'b ,
...)
typeconstr
=
[
`
tag-name1
typexpr1
| ... |
`
tag-namen
typexprn
]
が定義されているとき、パターン
# typeconstr は
or パターン
(
`
tag-name1
( _ :
typexpr1
)
| ... |
`
tag-namen
( _ :
typexprn
)
)
の略記法になります。
このパターンは型が
# typeconstr
であるすべての値にマッチします。
パターン
pattern1
, ... , patternn
は要素が各々
pattern1 から
patternn
までにマッチする n
要素のタプルにマッチします。
すなわち、このパターンはタプル値 (
について v1
, ..., v
)n
i
= 1, ..., n
なる v
i
が
patterni
にマッチするようなタプルにマッチします。