6.6 Patterns

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2008-11-29 (土) 13:50:57
          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 } |]                 

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

OperatorAssociativity
Constructor application--
::
,--
as--

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

Variable patterns

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

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

Constant patterns

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

Alias patterns

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

括弧つきのパターン

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

"Or" patterns

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

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

マッチングは左から右に処理されます. より正確には,

  • ここから未訳 Matching is performed from left to right. More precisely, in case some value v matches pattern_1 | pattern_2, the bindings performed are those of pattern_1 when v matches pattern_1. Otherwise, value v matches pattern_2 whose bindings are performed.

Variant patterns

The pattern constr pattern_1 matches all variants whose constructor is equal to constr, and whose argument matches pattern_1.

The pattern pattern_1 :: pattern_2 matches non-empty lists whose heads match pattern_1, and whose tails match pattern_2.

The pattern [ pattern_1 ; ... ; pattern_n ] matches lists of length n whose elements match pattern_1 ...pattern_n, respectively. This pattern behaves like pattern_1 :: ... :: pattern_n :: [].

Polymorphic variant patterns

The pattern `tag-name pattern_1 matches all polymorphic variants whose tag is equal to tag-name, and whose argument matches pattern_1.

Variant abbreviation patterns

If the type [('a,'b,...)] typeconstr = [`tag_1 typexpr_1 | ... | `tag_n typexpr_n] is defined, then the pattern #typeconstr is a shorthand for the or-pattern (`tag_1(_ : typexpr_1) | ... | `tag_n(_ : typexpr_n)). It matches all values of type #typeconstr.

Tuple patterns

The pattern pattern_1 , ... , pattern_n matches n-tuples whose components match the patterns pattern_1 through pattern_n. That is, the pattern matches the tuple values (v_1, ..., v_n) such that pattern_i matches v_i for i = 1,..., n.

Record patterns

The pattern { field_1 = pattern_1 ; ... ; field_n = pattern_n } matches records that define at least the fields field_1 through field_n, and such that the value associated to field_i matches the pattern pattern_i, for i = 1,... , n. The record value can define more fields than field_1 ...field_n; the values associated to these extra fields are not taken into account for matching.

Array patterns

The pattern [| pattern_1 ; ... ; pattern_n |] matches arrays of length n such that the i-th array element matches the pattern pattern_i, for i = 1,... , n.

新規 編集 添付