Обобщённый алгебраический тип данных

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск

Обобщённый алгебраи́ческий тип да́нных (GADT, англ. generalized algebraic data type) — один из видов алгебраических типов данных, который характеризуется тем, что его конструкторы могут возвращать значения не своего типа, связанного с ним[1]. Обобщённые АТД были придуманы под влиянием работ об индуктивных семействах в среде исследователей зависимых типов[2].

Такие типы реализованы в нескольких языках программирования, в частности в языках OCaml (начиная с версии 4)[3], Idris[4], Agda[5] и Haskell, причём в последнем оно не входит в стандарт языка Haskell-98, а реализовано только в одном из расширений компилятора GHC. Язык Haskell имитирует индуктивное семейство (англ. inductive family), представляя их типами, индексированными другими типами[5].

История[править | править вики-текст]

Ранняя версия обобщённых АТД была описана Леннартом Аугустсоном и Кентом Петерсоном в 1994 году и основывалась на сопоставлении с образцом в системе доказательства теорем ALF[6].

Обобщённые АТД были введены в 2003 году независимо Чейни (Cheney) и Хинце (Hinze) и до этого Си (Xi), Ченом (Chen) и Ченом (Chen) как расширения алгебраических типов данных ML и Haskell[7][8]. Введённые обобщённые АТД оказались эквивалентны друг другу и похожи на индуктивные семейства типов данных (или индуктивные типы данных), используемые в Coq в исчислении индуктивных конструкций[9].

В 2006 году Sulzmann, Wazny и Stuckey ввели расширенные алгебраические типы данных, сочетающие обобщённые АТД с экзистенциальными типами данных (англ.)русск. и ограничениями класса типов (англ.)русск., введёнными Перри (Perry), Ляуфером (Läufer) и Одерски (Odersky) в середине 1990-х.

Вывод типов при отсутствии деклараций типов, заданных программистом, является алгоритмически неразрешимой задачей, а функции, определённые на обобщённых АТД, в общем случае могут не принимать основные типы (англ.)русск.(principal types)[10][11].

Реконструкция типа требует при проектировании нескольких компромиссов и является по состоянию на 2011 год темой исследований.

Применения[править | править вики-текст]

Обобщённые АДТ применяются в обобщённом программировании, моделирования абстрактного синтаксиса высшего порядка (англ. higher-order abstract syntax) языков программирования и моделирования объектов, сохранения инвариантов структур данных, выражения ограничений во встроенных предметно-ориентированных языках[12].

Пример на Haskell[править | править вики-текст]

В следующем примере определяется обобщённый тип Type, в котором представлены несколько типов[13]:

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]

Примечания[править | править вики-текст]

  1. Koopman, Plasmeijer, Swierstra, 2009, pp. 178-179
  2. 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.
  3. Xavier Leroy. The state of OCaml, 2012 (англ.). OCaml Users and Developers Workshop 4 (14 September 2012). Проверено 13 декабря 2014.
  4. Idris Example
  5. 1 2 Bove, Ana and Dybjer, Peter and Norell, Ulf (2009). "A Brief Overview of Agda --- A Functional Language with Dependent Types" in TPHOLs '09. Proceedings of the 22Nd International Conference on Theorem Proving in Higher Order Logics: 73--78, Munich, Germany: Springer-Verlag. DOI:10.1007/978-3-642-03359-9_6. Bove:2009:BOA:1616077.1616085. Проверено 2013-12-06. 
  6. Augustsson, Petersson, 1994
  7. Cheney, Hinze, 2003, p. 25
  8. Xi, Chen, Chen, 2003
  9. Cheney, Hinze, 2003, p. 25-26
  10. Peyton Jones, Washburn, Weirich, 2004, p. 7
  11. Schrijvers, Peyton Jones, Sulzmann, Vytiniotis, 2004
  12. Wobbly types, 2004
  13. 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 Wobbly types: type inference for generalised algebraic data types (англ.) // Technical Report MS-CIS-05-25. — University of Pennsylvania, 2004.
  • Augustsson, Lennart; Petersson, Kent Silly type families (англ.). — 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. — С. 224–235. — DOI:10.1145/604131.604150
  • 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:10.1016/j.entcs.2007.11.012
  • Peyton Jones, Simon; Vytiniotis, Dimitrios; Weirich, Stephanie; Washburn, Geoffrey Simple Unification-based Type Inference for GADTs (англ.) // Proceedings of the ACM International Conference on Functional Programming (ICFP'06), Portland. — 2006.
  • Schrijvers, Tom, Peyton Jones, Simon, Sulzmann, Martin, Vytiniotis, Dimitrios Complete and Decidable Type Inference for GADTs (англ.) // Proceedings of the ACM International Conference on Functional Programming (ICFP'09), Edinburgh. — 2009.