Параметрический полиморфизм - Parametric polymorphism

В языки программирования и теория типов, параметрический полиморфизм это способ сделать язык более выразительным, сохраняя при этом полную статичность безопасность типа. Использование параметрических полиморфизм, функция или тип данных могут быть записаны в общем виде, чтобы они могли обрабатывать значения идентично вне зависимости от их типа.[1] Такие функции и типы данных называются общие функции и общие типы данных соответственно и составляют основу общее программирование.

Например, функция добавить , который объединяет два списка, может быть сконструирован так, что ему не важен тип элементов: он может добавлять списки целых чисел, списки действительных чисел, списки строк и т. д. Пусть переменная типа a обозначают тип элементов в списках. потом добавить можно набрать

для всех а. [а] × [а] -> [а]

куда [а] обозначает тип списков с элементами типа а. Мы говорим, что тип добавить является параметризованный для всех значений а. (Обратите внимание, что, поскольку существует только одна переменная типа, функция не может применяться только к любой паре списков: пара, а также список результатов должны состоять из элементов одного типа.) Для каждого места, где добавить применяется, определяется значение для а.

Следующий Кристофер Стрейчи,[2] параметрический полиморфизм можно противопоставить специальный полиморфизм, в котором одна полиморфная функция может иметь несколько различных и потенциально разнородных реализаций в зависимости от типа аргумента (ов), к которому она применяется. Таким образом, специальный полиморфизм, как правило, может поддерживать только ограниченное количество таких различных типов, поскольку для каждого типа должна быть предусмотрена отдельная реализация.

История

Параметрический полиморфизм впервые был введен в языки программирования в ML в 1975 г.[3] Сегодня он существует в Стандартный ML, OCaml, F #, Ада, Haskell, Меркурий, Визуальный пролог, Scala, Юля, Python, Машинопись, C ++ и другие. Ява, C #, Visual Basic .NET и Delphi каждый представил «дженерики» для параметрического полиморфизма. Некоторые реализации полиморфизма типов внешне похожи на параметрический полиморфизм, но также вводят специальные аспекты. Одним из примеров является C ++ специализация шаблона.

Самая общая форма полиморфизма - "более высокий ранг непредсказуемый полиморфизм ". Двумя популярными ограничениями этой формы являются полиморфизм ограниченного ранга (например, ранг-1 или Prenex полиморфизм) и предикативный полиморфизм. Вместе эти ограничения дают «предикативный предикативный полиморфизм», который по сути является формой полиморфизма, обнаруженного в ML и ранних версиях Haskell.

Полиморфизм высшего ранга

Полиморфизм ранга-1 (пренекс)

В Prenex полиморфный system, переменные типа не могут быть созданы с полиморфными типами.[4] Это очень похоже на то, что называется «стиль ML» или «Let-полиморфизм» (технически Let-полиморфизм ML имеет несколько других синтаксических ограничений). Это ограничение делает очень важным различие между полиморфными и неполиморфными типами; таким образом, в предикативных системах полиморфные типы иногда называют схемы типов чтобы отличить их от обычных (мономорфных) типов, которые иногда называют монотипии. Следствием этого является то, что все типы могут быть записаны в форме, в которой все квантификаторы помещаются на крайнюю внешнюю (предваряющую) позицию. добавить описанная выше функция, имеющая тип

для всех а. [а] × [а] -> [а]

Чтобы применить эту функцию к паре списков, необходимо заменить тип переменной а в типе функции, так что тип аргументов совпадает с типом результирующей функции. В непредсказуемый system, замещаемый тип может быть любым типом, включая тип, который сам является полиморфным; таким образом добавить может применяться к парам списков с элементами любого типа - даже к спискам полиморфных функций, таких как добавить Полиморфизм в языке ML является предикативным.[нужна цитата ] Это связано с тем, что предикативность вместе с другими ограничениями делает система типов достаточно просто, чтобы полный вывод типа всегда возможно.

В качестве практического примера OCaml (потомок или диалект ML ) выполняет вывод типов и поддерживает импредикативный полиморфизм, но в некоторых случаях, когда используется импредикативный полиморфизм, вывод системного типа является неполным, если программист не предоставляет явные аннотации типов.

Классифицировать-k полиморфизм

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

Вывод типа для ранга-2 полиморфизм разрешим, но реконструкция для ранга-3 и выше - нет.[5]

Классифицировать-п ("высший ранг") полиморфизм

Классифицировать-п полиморфизм - это полиморфизм, в котором кванторы могут появляться слева от произвольного количества стрелок.

Предикативность и отрицательность

Предикативный полиморфизм

В предикативной параметрической полиморфной системе тип содержащий переменную типа нельзя использовать таким образом, чтобы создается для полиморфного типа. Теории предикативного типа включают: Теория типа Мартина-Лёфа и NuPRL.

Импредикативный полиморфизм

Импредикативный полиморфизм (также называемый первоклассный полиморфизм) - самая мощная форма параметрического полиморфизма.[6] Определение называется непредсказуемый если он самореферентный; в теории типов это позволяет создать экземпляр переменной в типе с любым типом, включая полиморфные типы, такие как сам. Примером этого является Система F с переменной типа Икс в типе , куда Икс может даже относиться к Т сам.

В теория типов, наиболее часто изучаемые непредикативные типизированные λ-исчисления основаны на лямбда-куб, особенно Система F.[1]

Ограниченный параметрический полиморфизм

В 1985 г. Лука Карделли и Питер Вегнер признал преимущества разрешения границы по параметрам типа.[7] Многие операции требуют некоторого знания типов данных, но в остальном могут работать параметрически. Например, чтобы проверить, включен ли элемент в список, нам нужно сравнить элементы на предмет равенства. В Стандартный ML, введите параметры формы ’’ ограничены, чтобы была доступна операция равенства, поэтому функция будет иметь тип ’’ × ’’ список → bool и ’’ может быть только типом с определенным равенством. В Haskell, ограничение достигается требованием, чтобы типы принадлежали тип класс; таким образом, та же функция имеет тип в Haskell. В большинстве объектно-ориентированных языков программирования, поддерживающих параметрический полиморфизм, параметры могут быть ограничены подтипы данного типа (см. Полиморфизм подтипа и статья о Общее программирование ).

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

Примечания

  1. ^ а б c Пирс 2002.
  2. ^ Стрейчи 1967.
  3. ^ Милнер Р., Моррис Л., Ньюи М. "Логика для вычислимых функций с рефлексивными и полиморфными типами", Proc. Конференция по проверке и совершенствованию программ, Arc-et-Senans (1975)
  4. ^ Бенджамин С. Пирс; Бенджамин К. (профессор Пирс, Пенсильванский университет) (2002). Типы и языки программирования. MIT Press. ISBN  978-0-262-16209-8.
  5. ^ Пирс 2002, п. 359.
  6. ^ Пирс 2002, п. 340.
  7. ^ Карделли и Вегнер 1985.

Рекомендации