Previous Contents Next
6.6 Patterns

pattern ::= value-name
  | _
  | constant
  | pattern as  value-name
  | ( pattern )
  | ( pattern :  typexpr )
  | pattern |  pattern
  | ncconstr  pattern
  | `tag-name  pattern
  | #typeconstr-name
  | pattern  { , pattern }
  | { field =  pattern  { ; field =  pattern } }
  | [ pattern  { ; pattern } ]
  | pattern ::  pattern
  | [| pattern  { ; pattern } |]

下の表は、閉じてないパターン構築の場合の演算子の結合法則と優先順位を示しています。 優先度が高いものが先に来ます。
Operator Associativity
Constructor application --
::
, --
|
as --

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

Variable patterns

変数名を値として持つパターンは全ての値にマッチし、その値にその名前を束縛します。 パターン _ も全ての値にマッチしますが、 束縛はされません。

パターンは線形です。すなわち、変数はパターンに何度も表れることは 出来ません。実際、パターンのみを使ってデータ構造間の同等性を示すことは 出来ません。(when をこの目的に 使ってください。)

Constant patterns

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

Alias patterns

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

括弧つきのパターン

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

``Or'' パターン

パターン pattern1 |  pattern2 は、二つのパターン pattern1pattern2 の論理和を表します。 値が、 pattern1 |  pattern2 にマッチするとは、 pattern1 にマッチするか、 pattern2 にマッチすることを言います。 二つのサブパターン pattern1pattern2 は、同じ型を持つ値を示す、全く同じ識別子に束縛しなければなりません。 ``or'' パターンに対するマッチングによる束縛は、 まず pattern1 によるマッチングによって束縛されるか、 pattern2 によるマッチングによって束縛されるかのどちらかです。 両方が成功した場合は、どちらの束縛が選択されるかは未定義です。

Variant patterns

パターン ncconstr  pattern1 は、 コンストラクタが ncconstr で、引数が pattern1 である全てのバリアントにマッチします。

パターンpattern1 ::  pattern2 は、空リストでなく、head が pattern1 で、tail が pattern2 であるものにマッチします。 このパターンは、 ( :: ) ( pattern1 ,  pattern2 ) の様に動作します。

パターン [ pattern1 ; ... ;  patternn ] は、リストの長さが n であり、その要素がそれぞれ pattern1 ...patternn にマッチするものにマッチします。 このパターンは、 pattern1 :: ... ::  patternn :: [] の様に動作します。

Polymorphic variant patterns

パターン `tag-name pattern1 は、タグが tag-name で、その引数が pattern1 にマッチする全てのポリモーフィックバリアントにマッチします。

Variant abbreviation patterns

もし [('a,'b,...)] typeconstr = [`tag1  t1 | ... | `tagn  tn] が定義されていれば、パターン #typeconstr を、 or パターン (`tag1(_ : t1) | ... | `tagn(_ :  tn)) の略記として使えます。これは、型 #typeconstr の全ての値にマッチします。

Tuple patterns

パターン pattern1 , ... ,  patternn は、n 個のタプルで、要素が pattern1 から patternn にマッチするものにマッチします。 すなわち、このパターンは、タプル (v1, ...,  vn) で、 patternivi にマッチするもの (i = 1,... , n) にマッチします。

Record patterns

パターン { field1 =  pattern1 ; ... ;  fieldn =  patternn } は、少なくともフィールド field1 から fieldn が定義されたレコードで、 fieldi に関連付けられた値が patterni にマッチするもの (for i = 1,... , n) にマッチします。 レコードは、 field1 ...fieldn 以上のフィールドを持っていても構いませんが、そのほかのフィールドに関連付けられた値は、マッチングには考慮されません。

Array patterns

パターン [| pattern1 ; ... ;  patternn |] は、長さ n の配列で、i 番目の要素が patterni にマッチするもの (for i = 1,... , n) にマッチします。




Previous Contents Next