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

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

Пример

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

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

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

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

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

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

Высшие типы

Приложения

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

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

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

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

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

Примечания

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

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

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

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