Interested Article - Обобщённый алгебраический тип данных
- 2020-10-16
- 1
Обобщённый алгебраический тип да́нных ( англ. generalized algebraic data type, GADT ) — один из видов алгебраических типов данных , который характеризуется тем, что его конструкторы могут возвращать значения не своего типа, связанного с ним . Сконструированы под влиянием работ об индуктивных семействах в среде исследователей зависимых типов .
Такие типы реализованы в нескольких языках программирования, в частности в языках OCaml (начиная с версии 4) , Idris , Agda и Haskell , причём в последнем оно не входит в стандарт языка, а реализовано только в одном из расширений компилятора GHC . Язык Haskell имитирует ( англ. ), представляя их типами, индексированными другими типами .
Применяются в обобщённом программировании , моделировании ( англ. ) языков программирования и моделировании объектов, сохранении инвариантов структур данных , выражении ограничений во встроенных предметно-ориентированных языках .
История
Ранняя версия обобщённых алгебраических типов данных была описана Леннартом Аугустсоном и Кентом Петерсоном в 1994 году и основывалась на сопоставлении с образцом в системе доказательства теорем ALF .
В современной форме GADT были введены в 2003 году независимо Чейни ( Cheney ) и Хинце ( Hinze ) и до этого Си ( Xi ), Ченом ( Chen ) и Ченом ( Chen ) как расширения алгебраических типов данных ML и Haskell . Введённые обобщённые типы оказались эквивалентны друг другу и похожи на индуктивные семейства типов данных (или индуктивные типы данных), используемые в Coq в исчислении конструкций .
В 2006 году разработаны расширенные алгебраические типы данных, сочетающие обобщённые алгебраические типы данных с и ограничениями , введёнными Перри ( Perry ), Ляуфером ( Läufer ) и Одерски в середине 1990-х годов.
Вывод типов при отсутствии деклараций типов, заданных программистом, является алгоритмически неразрешимой задачей , а функции, определённые на обобщённых АТД, в общем случае могут не принимать ( англ. ) .
Реконструкция типа требует при проектировании нескольких компромиссов и является по состоянию на 2011 год темой исследований.
Пример на Haskell
В следующем примере определяется обобщённый тип
Type
, в котором представлены несколько типов
:
data Type :: * -> * where
Char :: Type Char
Int :: Type Int
List :: Type a -> Type [a]
Для этого типа можно составить функцию суммирования:
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]
Примечания
- , pp. 178—179.
- .
- Xavier Leroy. (англ.) . OCaml Users and Developers Workshop 4 (14 сентября 2012). Дата обращения: 13 декабря 2014. Архивировано из 2 января 2015 года.
- . Дата обращения: 13 декабря 2014. 16 декабря 2014 года.
-
↑
Bove, Ana and Dybjer, Peter and Norell, Ulf (2009).
.
Proceedings of the 22Nd International Conference on Theorem Proving in Higher Order Logics
. TPHOLs '09. Munich, Germany: Springer-Verlag. pp. 73—78.
doi
:
. Bove:2009:BOA:1616077.1616085
. Дата обращения:
6 декабря 2013
.
{{ cite conference }}
: Википедия:Обслуживание CS1 (множественные имена: authors list) ( ссылка ) - .
- .
- , p. 25.
- .
- , p. 25—26.
- , p. 7.
- .
- Hagiya, M. and Wadler, P. Functional and Logic Programming: 8th International Symposium, FLOPS 2006, Fuji-Susono, Japan, April 24-26, 2006, Proceedings. — Springer, 2006. — P. 17—18. — ISBN 9783540334385 .
Литература
- Koopman, P.; Plasmeijer, R.; Swierstra, D. Advanced Functional Programming: 6th International School, AFP 2008, Heijen, The Netherlands, May 19-24, 2008, Revised Lectures. — Springer, 2009. — 331 p. — ISBN 9783642046513 .
- Peyton Jones, Simon; Washburn, Geoffrey; Weirich, Stephanie. (англ.) // Technical Report MS-CIS-05-25. — University of Pennsylvania, 2004.
- Augustsson, Lennart; Petersson, Kent. (англ.) . — 1994.
- Cheney, James; Hinze, Ralf. First-Class Phantom Types (англ.) // Technical Report CUCIS TR2003-1901. — Cornell University, 2003.
- Xi, Hongwei; Chen, Chiyan; Chen, Gang. Guarded Recursive Datatype Constructors (англ.) // Proceedings of the 30th ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages (POPL'03). — ACM Press, 2003. — P. 224–235 . — doi : .
- Sheard, Tim; Pasalic, Emir. Meta-programming with built-in type equality (англ.) // Proceedings of the Fourth International Workshop on Logical Frameworks and Meta-languages (LFM'04), Cork. — 2004. — doi : .
- Schmid, U. and Kitzelmann, E. and Plasmeijer, R. Approaches and Applications of Inductive Programming: Third International Workshop, AAIP 2009, Edinburgh, UK, September 4, 2009, Revised Papers. — Springer, 2010. — P. 114—115. — ISBN 9783642119309 .
- Peyton Jones, Simon; Vytiniotis, Dimitrios; Weirich, Stephanie; Washburn, Geoffrey. (англ.) // Proceedings of the ACM International Conference on Functional Programming (ICFP'06), Portland. — 2006.
- Schrijvers, Tom, Peyton Jones, Simon, Sulzmann, Martin, Vytiniotis, Dimitrios. (англ.) // Proceedings of the ACM International Conference on Functional Programming (ICFP'09), Edinburgh. — 2009.
- 2020-10-16
- 1