stringtranslate.com

Расчет моделей

Исчисление шаблонов основывает все вычисления на сопоставлении с шаблоном очень общего вида. Подобно лямбда-исчислению , оно поддерживает единообразную обработку оценки функций . Кроме того, оно позволяет передавать функции в качестве аргументов и возвращать их в качестве результатов. Кроме того, исчисление шаблонов поддерживает единообразный доступ к внутренней структуре аргументов, будь то пары, списки или деревья . Кроме того, оно позволяет передавать шаблоны в качестве аргументов и возвращать их в качестве результатов. Единообразный доступ иллюстрируется функцией сопоставления с шаблоном 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.

Внешние ссылки