これらの2つの概念を見る1つの方法は、パターンマッチングが、コンストラクターでの差別化と用語の破壊(同時に、用語フラグメントの選択とローカル名付け)を安全、コンパクトかつ効率的に組み合わせるプログラミング言語の機能であると言うことです。パターンマッチングに関する研究は、通常、実装効率、たとえば、マッチングメカニズムが行う必要がある比較の数を最小限にする方法に焦点を当てています。
対照的に、用語の書き換えは、構文表現のサブターム(より正確には、変数のセット上の用語代数の要素)を他の用語に置き換える広範囲の(潜在的に非決定的な)方法を調査する計算の一般的なモデルです。用語書き換えシステムに関する研究は、通常、コンフルエンス、決定論、終了などの書き換えシステムの抽象的な特性に関するものであり、より具体的には、書き換えシステム上の代数演算によってそのような特性がどのように保存されるか、または保存されないか、つまり、これらの特性がどの程度合成されるかに関するものです。
(l 、r )C[ L σ] → C[ R σ]C[ 。]σ)、Haskell、OCaml、Scalaなどの現代言語のパターンマッチングでは、用語の「先頭」の書き換えのみが可能です。この制限は、Jayのパターン計算にも課せられていると思います。この制限の意味を説明しましょう。OCaml、Haskell、Scalaセンスのパターンマッチングでは、次のようなことは言えません
match M with
| C[ x :: _ ] -> printf "%i ...\n" x
| C[ [] ] -> printf "[]"
C[.]
ここは何ですか?これは、1つだけのコンテキストにわたる変数であると想定されています。しかし、OCaml、Haskell、Scalaなどの言語は、プログラマーに任意の(1つの穴のある)コンテキストに渡る変数を与えず、値に渡る変数のみを与えます。つまり、このような言語では、用語の任意の位置でパターンマッチを行うことはできません。パターンのルートから関心のある部分までのパスを常に指定する必要があります。複数の方法。たとえば、用語は2つの方法で(true, [9,7,4], "hello", 7)
パターンC[7]
に一致しますが、C[.]
そのようなコンテキストの範囲を想定しています。