Русская Википедия:Обобщённый алгебраический тип данных
Обобщённый алгебраический тип да́нных (Шаблон:Lang-en) — один из видов алгебраических типов данных, который характеризуется тем, что его конструкторы могут возвращать значения не своего типа, связанного с нимШаблон:Sfn. Сконструированы под влиянием работ об индуктивных семействах в среде исследователей зависимых типовШаблон:Sfn.
Такие типы реализованы в нескольких языках программирования, в частности в языках OCaml (начиная с версии 4)[1], Idris[2], Agda[3] и Haskell, причём в последнем оно не входит в стандарт языка, а реализовано только в одном из расширений компилятора GHC. Язык Haskell имитирует Шаблон:Нп2, представляя их типами, индексированными другими типами[3].
Применяются в обобщённом программировании, моделировании Шаблон:Нп2 языков программирования и моделировании объектов, сохранении инвариантов структур данных, выражении ограничений во встроенных предметно-ориентированных языкахШаблон:Sfn.
История
Ранняя версия обобщённых алгебраических типов данных была описана Леннартом Аугустсоном и Кентом Петерсоном в 1994 году и основывалась на сопоставлении с образцом в системе доказательства теорем ALFШаблон:Sfn.
В современной форме GADT были введены в 2003 году независимо Чейни (Шаблон:Lang-en2) и Хинце (Шаблон:Lang-en2) и до этого Си (Шаблон:Lang-en2), Ченом (Шаблон:Lang-en2) и Ченом (Шаблон:Lang-en2) как расширения алгебраических типов данных ML и HaskellШаблон:SfnШаблон:Sfn. Введённые обобщённые типы оказались эквивалентны друг другу и похожи на индуктивные семейства типов данных (или индуктивные типы данных), используемые в Coq в исчислении конструкцийШаблон:Sfn.
В 2006 году разработаны расширенные алгебраические типы данных, сочетающие обобщённые алгебраические типы данных с Шаблон:Iw и ограничениями Шаблон:Iw, введёнными Перри (Шаблон:Lang-en2), Ляуфером (Шаблон:Lang-en2) и Одерски в середине 1990-х годов.
Вывод типов при отсутствии деклараций типов, заданных программистом, является алгоритмически неразрешимой задачей, а функции, определённые на обобщённых АТД, в общем случае могут не принимать Шаблон:Нп2Шаблон:SfnШаблон:Sfn.
Реконструкция типа требует при проектировании нескольких компромиссов и является по состоянию на 2011 год темой исследований.
Пример на Haskell
В следующем примере определяется обобщённый тип Type
, в котором представлены несколько типов[4]:
data Type :: * -> * where
Char :: Type Char
Int :: Type Int
List :: Type a -> Type [a]
Для этого типа можно составить ad-hoc-полиморфную функцию суммирования:
sum :: Type a -> a -> Int
sum Char _ = 0
sum Int n = n
sum (List a) xs = foldr (+) 0 (map (sum a) xs)
Которую можно применять для типов, поддерживаемых Type
, например, для типа [Int]
:
sum (List Int) [1, 2, 4]
Примечания
Литература
- Шаблон:Книга
- Шаблон:Статья
- Шаблон:Статья
- Шаблон:Статья
- Шаблон:Статья
- Шаблон:Статья
- Шаблон:Книга
- Шаблон:Статья
- Шаблон:Статья
- Страницы, использующие устаревший тег source
- Русская Википедия
- Функциональное программирование
- Типы данных
- Программирование с зависимыми типами
- Составные типы данных
- Страницы, где используется шаблон "Навигационная таблица/Телепорт"
- Страницы с телепортом
- Википедия
- Статья из Википедии
- Статья из Русской Википедии