Исчисление шаблонов - Pattern calculus

Исчисление шаблонов основывает все вычисления на сопоставление с образцом очень общего вида. Нравиться лямбда-исчисление, он поддерживает единообразное лечение оценка функции. Кроме того, он позволяет передавать функции как аргументы и возвращать их как результаты. Кроме того, исчисление шаблонов поддерживает единообразный доступ к внутренней структуре аргументов, будь то пары или списки или же деревья. Кроме того, он позволяет передавать шаблоны в качестве аргументов и возвращать их в качестве результатов. Единый доступ иллюстрируется функцией сопоставления шаблонов размер который вычисляет размер произвольного структура данных. В обозначениях язык программированиябонди, это дается рекурсивная функция

позволять rec размер =  | Икс у -> (размер Икс) + (размер у)  | Икс -> 1

Второй, или случай по умолчанию х -> 1 соответствует шаблону Икспротив аргумента и возвращает 1. Этот случай используется только в том случае, если сопоставление не удалось в первом случае. Первый или особый случай матчи против любых сложный, например, непустой список или пара. Соответствующие привязки Икс к левому компоненту и у к нужному компоненту. Затем корпус кейса складывает размеры этих компонентов вместе.

Подобные методы дают общие запросы для поиска и обновления. Комбинируя таким образом рекурсию и декомпозицию, получаем полиморфизм путей.

Возможность передавать шаблоны в качестве параметров (полиморфизм паттернов) иллюстрируется определением универсального элиминатора. Предположим, что заданы конструкторы Лист для создания листьев дерева, и Считать для конвертации чисел в счетчики. Соответствующие элиминаторы тогда

elimLeaf  = |  Лист у -> у elimCount = | Считать у -> у

Например, elimLeaf (Лист 3) оценивает 3 так же как и elimCount (счетчик 3).

Эти примеры можно получить, применив универсальный элиминаторЭлим к рассматриваемым конструкторам. Это определяется

Элим = | Икс -> | {у} Икс у -> у

Сейчас же Элим Лист оценивает | {y} Лист y -> y что эквивалентно elimLeaf. Также элим граф эквивалентно elimCount.

В общем, фигурные скобки {} содержат связанные переменные шаблона, так что Икс бесплатно и у связан в | {y} x y -> y.

внешняя ссылка