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 } |] 下の表は、閉じてないパターン構築の場合の演算子の結合法則と優先順位を示しています。 優先度が高いものが先に来ます。
パターンは、与えられた形のデータ構造を選択し、データ構造の 要素の識別子として束縛されます。この選択操作をパターンマッチング と呼びます。つまり、「この値は、このパターンにはマッチしない」 か、「この値はこのパターンにマッチするから、その値に ある名前を束縛させる」ということになります。 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 によるマッチングによって束縛されるかのどちらかです。 両方が成功した場合は、どちらの束縛が選択されるかは未定義です。 マッチングは左から右に処理されます. より正確には,
Variant patternsThe 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 patternsThe pattern `tag-name pattern_1 matches all polymorphic variants whose tag is equal to tag-name, and whose argument matches pattern_1. Variant abbreviation patternsIf 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 patternsThe 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 patternsThe 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 patternsThe 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. |