Исчисление шаблонов основывает все вычисления на сопоставлении с шаблоном очень общего вида. Подобно лямбда-исчислению , оно поддерживает единообразную обработку оценки функций . Кроме того, оно позволяет передавать функции в качестве аргументов и возвращать их в качестве результатов. Кроме того, исчисление шаблонов поддерживает единообразный доступ к внутренней структуре аргументов, будь то пары, списки или деревья . Кроме того, оно позволяет передавать шаблоны в качестве аргументов и возвращать их в качестве результатов. Единообразный доступ иллюстрируется функцией сопоставления с шаблоном size
, которая вычисляет размер произвольной структуры данных . В нотации языка программирования bondi это задается рекурсивной функцией
пусть размер записи = | x y -> ( размер x ) + ( размер y ) | x -> 1
Второй, или случай по умолчанию, x -> 1
сопоставляет шаблон x
с аргументом и возвращает 1
. Этот случай используется только в том случае, если сопоставление не удалось в первом случае. Первый, или особый случай, сопоставляет с любым составным , таким как непустой список или пара. Сопоставление привязывается x
к левому компоненту и y
к правому компоненту. Затем тело случая складывает размеры этих компонентов.
Похожие методы дают общие запросы для поиска и обновления. Объединение рекурсии и декомпозиции таким образом дает полиморфизм путей .
Возможность передавать шаблоны в качестве параметров ( полиморфизм шаблонов ) иллюстрируется определением универсального элиминатора. Предположим, что даны конструкторы Leaf
для создания листьев дерева и Count
для преобразования чисел в счетчики. Соответствующие элиминаторы тогда
elimLeaf = | Лист y -> y elimCount = | Количество y -> y
Например, elimLeaf (Leaf 3)
оценивается 3
как elimCount (Count 3)
.
Эти примеры можно получить, применив универсальный элиминатор elim
к рассматриваемым конструкторам. Он определяется как
элим = | х -> | { у } х у -> у
Теперь elim Leaf
вычисляется как | {y} Leaf y -> y
, что эквивалентно elimLeaf
. Также elim Count
эквивалентно elimCount
.
В общем случае фигурные скобки {}
содержат связанные переменные шаблона, поэтому он x
свободен и y
связан в | {y} x y -> y
.