Один із способів перегляду цих двох понять - сказати, що відповідність шаблонів є особливістю мов програмування для поєднання дискримінації за конструкторами та руйнування термінів (в той же час вибору та локального називання фрагментів термінів) безпечно, компактно та ефективно. Дослідження відповідності шаблонів, як правило, зосереджуються на ефективності впровадження, наприклад, на тому, як мінімізувати кількість порівнянь, якими повинен відповідати механізм узгодження.
На противагу цьому, переписування термінів - це загальна модель обчислень, яка досліджує широкий спектр (потенційно недетермінованих) методів заміни підтермій синтаксичних виразів (точніше, елемента терміна-алгебри над деяким набором змінних) іншими термінами. Дослідження систем переписування термінів зазвичай стосуються абстрактних властивостей систем переписування, таких як злиття, детермінізм та закінчення, а точніше про те, як такі властивості є або не зберігаються алгебраїчними операціями над переписаними системами, тобто в якій мірі ці властивості є композиційними.
( l , r )С[ l σ] → С[ r σ]С[ . ]σ), тоді як відповідність шаблонів у сучасних мовах, таких як Haskell, OCaml або Scala, передбачає лише перезапис "у верхній частині" терміна. Це обмеження також, я думаю, накладене в обчисленні схеми Джея. Дозвольте мені пояснити, що я маю на увазі під цим обмеженням. Маючи відповідність шаблону в сенсі OCaml, Haskell, Scala, ви не можете сказати щось подібне
match M with
| C[ x :: _ ] -> printf "%i ...\n" x
| C[ [] ] -> printf "[]"
Що C[.]
тут? Це повинна бути змінна, яка перебуває в межах одного отвору контекстів. Але такі мови, як OCaml, Haskell або Scala, не дають програмістам змінних, що перебувають у діапазоні довільних (одноколесних) контекстів, а лише змінних, що перебувають у межах значень. Іншими словами, у таких мовах ви не можете встановити збіг у довільній позиції в терміні. Вам завжди потрібно вказати шлях від кореня шаблону до тих частин, які вас цікавлять. Я думаю, ключовою причиною накладення цього обмеження є те, що в іншому випадку відповідність шаблону не буде детермінованою, оскільки термін може відповідати шаблону в більше ніж один спосіб. Наприклад, термін (true, [9,7,4], "hello", 7)
відповідає шаблону C[7]
двома способами, припускаючи, що це C[.]
діапазон у таких контекстах.