stringtranslate.com

Полиморфная рекурсия

В информатике полиморфная рекурсия (также называемая типизацией Милнера - Майкрофта или исчислением Милнера-Майкрофта ) относится к рекурсивной параметрически полиморфной функции , где параметр типа изменяется с каждым рекурсивным вызовом, а не остается постоянным. Вывод типа для полиморфной рекурсии эквивалентен полуунификации и, следовательно, неразрешим и требует использования полуалгоритма или аннотаций типов , предоставляемых программистом . [1]

Пример

Вложенные типы данных

Рассмотрим следующий вложенный тип данных в Haskell :

данные Вложенные a = a :<: ( Вложенные [ a ]) | Эпсилон инфиксr 5 :<:           вложенный = 1 :<: [ 2 , 3 , 4 ] :<: [[ 5 , 6 ],[ 7 ],[ 8 , 9 ]] :<: Эпсилон        

Функция длины, определенная для этого типа данных, будет полиморфно рекурсивной, поскольку тип аргумента изменяется с Nested aна Nested [a]в рекурсивном вызове:

длина :: Вложенный a -> Int длина Эпсилон = 0 длина ( _ :<: xs ) = 1 + длина xs                

Обратите внимание, что Haskell обычно выводит сигнатуру типа для такой простой на вид функции, но здесь ее нельзя опустить, не вызвав ошибку типа.

Типы более высокого ранга

Приложения

Анализ программы

В анализе программ на основе типов полиморфная рекурсия часто необходима для получения высокой точности анализа. Известные примеры систем, использующих полиморфную рекурсию, включают анализ времени связывания Дюссара, Хенглейна и Моссина [2] и систему управления памятью на основе регионов Тофте–Талпина . [3] Поскольку эти системы предполагают, что выражения уже были типизированы в базовой системе типов (не обязательно использующей полиморфную рекурсию), вывод может быть снова сделан разрешимым.

Структуры данных, обнаружение ошибок, графические решения

Структуры данных функционального программирования часто используют полиморфную рекурсию для упрощения проверок ошибок типов и решения проблем с неприятными «промежуточными» временными решениями, которые пожирают память в более традиционных структурах данных, таких как деревья. В двух следующих цитатах Окасаки (стр. 144–146) приводит пример CONS в Haskell , в котором полиморфная система типов автоматически отмечает ошибки программиста. [4] Рекурсивный аспект заключается в том, что определение типа гарантирует, что самый внешний конструктор имеет один элемент, второй — пару, третий — пару пар и т. д. рекурсивно, устанавливая автоматический шаблон поиска ошибок в типе данных. Робертс (стр. 171) приводит связанный пример в Java , используя Class для представления стекового фрейма. Приведенный пример является решением проблемы Ханойской башни , в которой стек имитирует полиморфную рекурсию с начальной, временной и конечной вложенной структурой подстановки стека. [5]

Смотрите также

Примечания

  1. ^ Хенглейн 1993.
  2. ^ Дюссар, Дирк; Хенглейн, Фриц; Моссин, Кристиан. «Полиморфная рекурсия и квалификации подтипов: анализ полиморфного времени связывания в полиномиальном времени». Труды 2-го Международного симпозиума по статическому анализу (SAS) . CiteSeerX  10.1.1.646.5884 .
  3. ^ Tofte, Mads ; Talpin, Jean-Pierre (1994). «Реализация типизированного λ-исчисления вызова по значению с использованием стека регионов». POPL '94: Труды 21-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . Нью-Йорк, США: ACM. стр. 188–201. doi : 10.1145/174675.177855 . ISBN 0-89791-636-0.
  4. ^ Крис Окасаки (1999). Чисто функциональные структуры данных . Нью-Йорк: Кембридж. стр. 144. ISBN 978-0521663502.
  5. ^ Эрик Робертс (2006). Рекурсивное мышление с помощью Java . Нью-Йорк: Wiley. С. 171. ISBN 978-0471701460.

Дальнейшее чтение

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