Параметрический полиморфизм
Полиморфизм |
---|
Специальный полиморфизм |
Параметрический полиморфизм |
Подтипирование |
В языках программирования и теории типов параметрический полиморфизм позволяет присвоить одному фрагменту кода «общий» тип, используя переменные вместо фактических типов, а затем при необходимости создавать экземпляры с конкретными типами. [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 (предикативный)
[ редактировать ]Этот раздел нуждается в дополнительных цитатах для проверки . ( февраль 2019 г. ) |
В системе предикативных типов (также известной как пренекс- полиморфная система) переменные типа не могут быть созданы с помощью полиморфных типов. [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 ограничение достигается требованием принадлежности типов к классу типов ; таким образом, одна и та же функция имеет тип в Хаскеле. В большинстве объектно-ориентированных языков программирования, поддерживающих параметрический полиморфизм, параметры могут быть ограничены подтипами заданного типа (см. статьи Полиморфизм подтипов и Универсальное программирование ).
См. также
[ редактировать ]- Параметричность
- Полиморфная рекурсия
- Класс типов # Полиморфизм высшего рода
- Черта (компьютерное программирование)
Примечания
[ редактировать ]- ^ Jump up to: Перейти обратно: а б с д и ж Бенджамин К. Пирс (2002). Типы и языки программирования . МТИ Пресс. ISBN 978-0-262-16209-8 .
- ^ Стрейчи, Кристофер (1967), Фундаментальные концепции языков программирования (конспекты лекций), Копенгаген: Международная летняя школа по компьютерному программированию . Переиздано в: Стрейчи, Кристофер (1 апреля 2000 г.). «Основные понятия языков программирования» . Вычисления высшего порядка и символьные вычисления . 13 (1): 11–49. дои : 10.1023/А:1010000313106 . ISSN 1573-0557 . S2CID 14124601 .
- ^ Йорги, Брент. «Больше полиморфизма и классов типов» . www.seas.upenn.edu . Проверено 1 октября 2022 г.
- ^ Ву, Брэндон. «Параметрический полиморфизм — Справка SML» . smlhelp.github.io . Проверено 1 октября 2022 г.
- ^ «Отчет о языке Haskell 2010 § 4.1.2 Синтаксис типов» . www.haskell.org . Проверено 1 октября 2022 г.
За одним исключением (переменная выделенного типа в объявлении класса (раздел 4.3.1)), все переменные типа в выражении типа Haskell считаются универсально квантифицированными; для количественной оценки универсальности не существует явного синтаксиса.
- ^ Милнер, Р. , Моррис, Л., Ньюи, М. «Логика для вычислимых функций с рефлексивными и полиморфными типами», Proc. Конференция по проверке и улучшению программ , Arc-et-Senans (1975 г.)
- ^ Кван Юл Со. «Блог Кванга на Haskell — Полиморфизм более высокого ранга» . kseo.github.io . Проверено 30 сентября 2022 г.
- ^ Кфури, Эй Джей; Уэллс, Дж. Б. (1 января 1999 г.). «Княжество и вывод разрешимого типа для типов пересечений конечного ранга». Материалы 26-го симпозиума ACM SIGPLAN-SIGACT по принципам языков программирования . Ассоциация вычислительной техники. стр. 161–174. дои : 10.1145/292540.292556 . ISBN 1581130953 . S2CID 14183560 .
- ^ Карделли и Вегнер 1985 .
Ссылки
[ редактировать ]- Хиндли, Дж. Роджер (1969), «Основная схема типа объекта в комбинаторной логике», Transactions of the American Mathematical Society , 146 : 29–60, doi : 10.2307/1995158 , JSTOR 1995158 , MR 0253905 .
- Жирар, Жан-Ив (1971). «Расширение интерпретации Гёделя на анализ и его применение для устранения сокращений в анализе и теории типов». Материалы Второго скандинавского логического симпозиума . Исследования по логике и основам математики (на французском языке). Полет. 63. Амстердам. стр. 63–92. дои : 10.1016/S0049-237X(08)70843-7 . ISBN 9780720422597 .
- Жирар, Жан-Ив (1972), Функциональная интерпретация и устранение сокращений в арифметике высшего порядка (докторская диссертация) (на французском языке), Парижский университет 7 .
- Рейнольдс, Джон К. (1974), «К теории типовой структуры» , Коллок по программированию , Конспекты лекций по информатике , 19 , Париж: 408–425, номер документа : 10.1007/3-540-06859-7_148 , ISBN 978-3-540-06859-4 .
- Милнер, Робин (1978). «Теория полиморфизма типов в программировании» (PDF) . Журнал компьютерных и системных наук . 17 (3): 348–375. дои : 10.1016/0022-0000(78)90014-4 . S2CID 388583 .
- Карделли, Лука ; Вегнер, Питер (декабрь 1985 г.). «О понимании типов, абстракции данных и полиморфизме» (PDF) . Обзоры вычислительной техники ACM . 17 (4): 471–523. CiteSeerX 10.1.1.117.695 . дои : 10.1145/6041.6042 . ISSN 0360-0300 . S2CID 2921816 .
- Пирс, Бенджамин К. (2002). Типы и языки программирования . МТИ Пресс. ISBN 978-0-262-16209-8 .