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

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

Параметрический полиморфизм можно противопоставить специальному полиморфизму . Параметрически полиморфные определения единообразны : они ведут себя одинаково независимо от типа, в котором они созданы. [1] : 340  [2] : 37  Напротив, в специальных полиморфных определениях каждому типу дается отдельное определение. Таким образом, специальный полиморфизм обычно может поддерживать только ограниченное количество таких различных типов, поскольку для каждого типа должна быть предусмотрена отдельная реализация.

Основное определение [ править ]

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

Затем полиморфное определение можно реализовать , заменив любой конкретный тип на любой конкретный тип. , что дает полное семейство потенциальных типов. [3]

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

который может быть создан для любого типа в семействе.

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

В выражении , создается для и создается для в звонке , поэтому тип общего выражения равен .

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

История [ править ]

Параметрический полиморфизм был впервые представлен в языках программирования ML в 1975 году. [6] Сегодня он существует в Standard ML , OCaml , F# , Ada , Haskell , Mercury , Visual Prolog , Scala , Julia , Python , TypeScript , C++ и других. Java , C# , Visual Basic .NET и Delphi представили «обобщенные шаблоны» для параметрического полиморфизма. Некоторые реализации полиморфизма типов внешне похожи на параметрический полиморфизм, но при этом также вводят специальные аспекты. Одним из примеров является C++ специализация шаблонов .

Предикативность, непредикативность и полиморфизм ранга высокого более

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

В системе предикативных типов (также известной как пренекс- полиморфная система) переменные типа не могут быть созданы с помощью полиморфных типов. [1] : 359–360  Теории предикативных типов включают теорию типов Мартина-Лёфа и Nuprl . Это очень похоже на то, что называется «стилем ML» или «Let-полиморфизмом» (технически Let-полиморфизм ML имеет несколько других синтаксических ограничений).Это ограничение делает различие между полиморфными и неполиморфными типами очень важным; таким образом, в предикативных системах полиморфные типы иногда называют схемами типов, чтобы отличить их от обычных (мономорфных) типов, которые иногда называют монотипами .

Следствием предикативности является то, что все типы могут быть записаны в форме, в которой все кванторы располагаются в самой внешней (пренексной) позиции. Например, рассмотрим описанная выше функция, которая имеет следующий тип:

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

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

Полиморфизм более высокого ранга [ править ]

Некоторые системы типов поддерживают непредикативный конструктор типов функций, хотя другие конструкторы типов остаются предикативными. Например, тип разрешено в системе, поддерживающей полиморфизм более высокого ранга, даже если может быть и нет. [7]

Говорят, что тип имеет ранг k (для некоторого фиксированного целого числа k ), если нет пути от его корня до квантор проходит слева от k или более стрелок, если тип нарисован в виде дерева. [1] : 359  Говорят, что система типов поддерживает полиморфизм ранга k, если она допускает типы с рангом, меньшим или равным k . Например, система типов, поддерживающая полиморфизм ранга 2, позволит но не . Система типов, допускающая типы произвольного ранга, называется «полиморфной ранга n ».

Вывод типа для полиморфизма ранга 2 разрешим, но для полиморфизма ранга 3 и выше — нет. [8] [1] : 359 

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

Импредикативный полиморфизм (также называемый полиморфизмом первого класса ) является наиболее мощной формой параметрического полиморфизма. [1] : 340  В формальной логике определение называется непредикативным, если оно самореферентно; в теории типов это относится к способности типа находиться в области содержащегося в нем квантора. Это позволяет создавать экземпляры любой переменной типа любого типа, включая полиморфные типы. Примером системы, поддерживающей полную непредикативность, является Система F , которая позволяет создавать экземпляры. любого типа, включая самого себя.

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

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

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

См. также [ править ]

Примечания [ править ]

  1. ^ Перейти обратно: а б с д и ж Бенджамин К. Пирс (2002). Типы и языки программирования . МТИ Пресс. ISBN  978-0-262-16209-8 .
  2. ^ Стрейчи, Кристофер (1967), Фундаментальные концепции языков программирования (конспекты лекций), Копенгаген: Международная летняя школа по компьютерному программированию . Переиздано в: Стрейчи, Кристофер (1 апреля 2000 г.). «Основные понятия языков программирования» . Вычисления высшего порядка и символьные вычисления . 13 (1): 11–49. дои : 10.1023/А:1010000313106 . ISSN   1573-0557 . S2CID   14124601 .
  3. ^ Йорги, Брент. «Больше полиморфизма и классов типов» . www.seas.upenn.edu . Проверено 1 октября 2022 г.
  4. ^ Ву, Брэндон. «Параметрический полиморфизм — Справка SML» . smlhelp.github.io . Проверено 1 октября 2022 г.
  5. ^ «Отчет о языке Haskell 2010 § 4.1.2 Синтаксис типов» . www.haskell.org . Проверено 1 октября 2022 г. За одним исключением (переменная выделенного типа в объявлении класса (раздел 4.3.1)), все переменные типа в выражении типа Haskell считаются универсально квантифицированными; для количественной оценки универсальности не существует явного синтаксиса.
  6. ^ Милнер, Р. , Моррис, Л., Ньюи, М. «Логика для вычислимых функций с рефлексивными и полиморфными типами», Proc. Конференция по проверке и улучшению программ , Arc-et-Senans (1975 г.)
  7. ^ Кван Юл Со. «Блог Кванга о Haskell — Полиморфизм более высокого ранга» . kseo.github.io . Проверено 30 сентября 2022 г.
  8. ^ Кфури, Эй Джей; Уэллс, Дж. Б. (1 января 1999 г.). «Княжество и вывод разрешимого типа для типов пересечений конечного ранга». Материалы 26-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . Ассоциация вычислительной техники. стр. 161–174. дои : 10.1145/292540.292556 . ISBN  1581130953 . S2CID   14183560 .
  9. ^ Карделли и Вегнер 1985 .

Ссылки [ править ]