Zobecněný algebraický datový typ - Generalized algebraic data type
v Funkcionální programování, a zobecněný algebraický datový typ (GADT, taky prvotřídní fantomový typ,[1] hlídaný rekurzivní datový typ,[2] nebo rovnoprávný typ[3]) je zobecněním parametrické algebraické datové typy.
Přehled
V GADT konstruktéři produktu (tzv datové konstruktory v Haskell ) může poskytnout explicitní instanci ADT jako instanci typu jejich návratové hodnoty. To umožňuje definovat funkce s pokročilejším chováním typu. U datového konstruktoru Haskell 2010 má návratová hodnota instanci typu implikovanou instancí parametrů ADT v aplikaci konstruktoru.
- Parametrický ADT, který není GADTdata Seznam A = Nula | Nevýhody A (Seznam A)celá čísla = Nevýhody 12 (Nevýhody 107 Nula) - typ celých čísel je List Intstruny = Nevýhody "loď" (Nevýhody "dok" Nula) - typ řetězců je List String- GADTdata Expr A kde EBool :: Boole -> Expr Boole EInt :: Int -> Expr Int Rovnocenné :: Expr Int -> Expr Int -> Expr Booleeval :: Expr A -> Aeval E = případ E z EBool A -> A EInt A -> A Rovnocenné A b -> (eval A) == (eval b)expr1 = Rovnocenné (EInt 2) (EInt 3) - typ expr1 je Expr Boolret = eval expr1 - ret je False
V současné době jsou implementovány v EU GHC překladač jako nestandardní rozšíření, používaný mimo jiné Mopslíci a Darcs. OCaml nativně podporuje GADT od verze 4.00.[4]
Implementace GHC poskytuje podporu pro existenciálně kvantifikované parametry typu a pro místní omezení.
Dějiny
Časnou verzi zobecněných algebraických datových typů popsal Augustsson & Petersson (1994) a na základě porovnávání vzorů v ALF.
Zobecněné algebraické datové typy byly zavedeny nezávisle na sobě Cheney & Hinze (2003) a před Xi, Chen & Chen (2003) jako rozšíření do ML a Haskell je algebraické datové typy.[5] Oba jsou v zásadě rovnocenné. Jsou podobné jako induktivní rodiny datových typů (nebo induktivní datové typy) nalezen v Coq je Počet indukčních konstrukcí a další závislé typy jazyků, modulovat závislé typy a kromě toho, že tyto mají další omezení pozitivity který není v GADT vynucován.[6]
Sulzmann, Wazny & Stuckey (2006) představen rozšířené algebraické datové typy které kombinují GADT s existenční datové typy a typová třída omezení zavedená Perry (1991) , Läufer & Odersky (1994) a Läufer (1996) .
Odvození typu v nepřítomnosti dodaného programátoru zadejte poznámky je nerozhodnutelný[7] a funkce definované přes GADT nepřipouštějí hlavní typy obecně.[8] Typ rekonstrukce vyžaduje několik kompromisů designu a je oblastí aktivního výzkumu (Peyton Jones, Washburn & Weirich 2004; Peyton Jones a kol. 2006; Pottier & Régis-Gianas 2006 ; Sulzmann, Schrijvers & Stuckey 2006; Simonet & Pottier 2007 ; Schrijvers a kol. 2009; Lin & Sheard 2010a ; Lin & Sheard 2010b ; Vytiniotis, Peyton Jones & Schrijvers 2010 ; Vytiniotis a kol. 2011 ).
Aplikace
Mezi aplikace GADT patří generické programování, modelování programovacích jazyků (vyšší syntaxe abstraktního řádu ), udržování invarianty v datové struktury, vyjadřující omezení v vestavěné jazyky specifické pro doménu a modelování objektů.[9]
Abstraktní syntaxe vyššího řádu
Důležitou aplikací GADT je vložení vyšší syntaxe abstraktního řádu v typ bezpečný móda. Zde je vložení souboru jednoduše zadaný lambda kalkul s libovolnou sbírkou základní typy, n-tice a a kombinátor pevných bodů:
data Lam :: * -> * kde Výtah :: A -> Lam A - ^ zvednutá hodnota Pár :: Lam A -> Lam b -> Lam (A, b) - ^ produkt Lam :: (Lam A -> Lam b) -> Lam (A -> b) - ^ lambda abstrakce Aplikace :: Lam (A -> b) -> Lam A -> Lam b - ^ funkce aplikace Opravit :: Lam (A -> A) -> Lam A - ^ pevný bod
A funkce bezpečného vyhodnocení typu:
eval :: Lam t -> teval (Výtah proti) = protieval (Pár l r) = (eval l, eval r)eval (Lam F) = X -> eval (F (Výtah X))eval (Aplikace F X) = (eval F) (eval X)eval (Opravit F) = (eval F) (eval (Opravit F))
Faktoriální funkci lze nyní zapsat jako:
skutečnost = Opravit (Lam (F -> Lam (y -> Výtah (-li eval y == 0 pak 1 jiný eval y * (eval F) (eval y - 1)))))eval(skutečnost)(10)
Při použití běžných algebraických datových typů bychom narazili na problémy. Zrušení parametru typu by způsobilo, že zvednuté základní typy existenciálně kvantifikovaly, což znemožňuje zápis hodnotitele. S parametrem typu bychom byli stále omezeni na jeden základní typ. Navíc špatně tvarované výrazy jako např App (Lam (x -> Lam (y -> App x y))) (Lift True)
by bylo možné postavit, zatímco jsou typově nesprávné pomocí GADT. Dobře vytvořený analog je App (Lam (x -> Lam (y -> App x y))) (Lift (z -> True))
. Je to proto, že typ X
je Lam (a -> b)
, odvozený z typu Lam
datový konstruktor.
Viz také
Poznámky
- ^ Cheney & Hinze 2003.
- ^ Xi, Chen & Chen 2003.
- ^ Sheard & Pasalic 2004.
- ^ „OCaml 4.00.1“. ocaml.org.
- ^ Cheney & Hinze 2003, str. 25.
- ^ Cheney & Hinze 2003, s. 25–26.
- ^ Peyton Jones, Washburn & Weirich 2004, str. 7.
- ^ Schrijvers a kol. 2009, str. 1.
- ^ Peyton Jones, Washburn & Weirich 2004, str. 3.
Další čtení
- Aplikace
- Augustsson, Lennart; Petersson, Kent (září 1994). "Hloupé rodiny typu" (PDF). Citovat deník vyžaduje
| deník =
(Pomoc)CS1 maint: ref = harv (odkaz) - Cheney, James; Hinze, Ralfe (2003). "Prvotřídní fantomové typy". Technická zpráva CUCIS TR2003-1901. Cornell University. hdl:1813/5614.CS1 maint: ref = harv (odkaz)
- Xi, Hongwei; Chen, Chiyan; Chen, Gang (2003). Hlídané rekurzivní konstruktory datových typů. Sborník 30. sympozia ACM SIGPLAN-SIGACT o zásadách programovacích jazyků (POPL'03). Stiskněte ACM. str. 224–235. CiteSeerX 10.1.1.59.4622. doi:10.1145/604131.604150. ISBN 978-1581136289.CS1 maint: ref = harv (odkaz)
- Sheard, Tim; Pasalic, Emir (2004). „Metaprogramování s integrovanou rovností typů“. Proceedings of the Fourth International Workshop on Logical Frameworks and Meta-languages (LFM'04), Cork. 199: 49–65. doi:10.1016 / j.entcs.2007.11.012.CS1 maint: ref = harv (odkaz)
- Sémantika
- Patricia Johann a Neil Ghani (2008). "Základy strukturovaného programování s GADT".
- Arie Middelkoop, Atze Dijkstra a S. Doaitse Swierstra (2011). "Štíhlá specifikace pro GADT: systém F s prvotřídními důkazy o rovnosti". Vyšší řád a symbolický výpočet.
- Typ rekonstrukce
- Peyton Jones, Simon; Washburn, Geoffrey; Weirich, Stephanie (2004). "Wobble types: type inference for generalized algebraic data types" (PDF). Technická zpráva MS-CIS-05-25. University of Pennsylvania.CS1 maint: ref = harv (odkaz)
- Peyton Jones, Simon; Vytiniotis, Dimitrios; Weirich, Stephanie; Washburn, Geoffrey (2006). „Odvození typu založené na jednoduchém sjednocení pro GADT“ (PDF). Sborník mezinárodní konference ACM o funkčním programování (ICFP'06), Portland.CS1 maint: ref = harv (odkaz)
- Sulzmann, Martin; Wazny, Jeremy; Stuckey, Peter J. (2006). "Rámec pro rozšířené algebraické datové typy". V Hagiya, M .; Wadler, P. (eds.). 8. mezinárodní symposium o funkčním a logickém programování (FLOPS 2006). Přednášky z informatiky. 3945. str. 46–64.CS1 maint: ref = harv (odkaz)
- Sulzmann, Martin; Schrijvers, Tom; Stuckey, Peter J. (2006). Msgstr "Odvození hlavního typu pro třídy typů s více parametry, které jsou ve stylu GHC". V Kobayashi, Naoki (ed.). Programovací jazyky a systémy: 4. asijské sympozium (APLAS 2006). Přednášky z informatiky. 4279. 26–43.CS1 maint: ref = harv (odkaz)
- Schrijvers, Tom; Peyton Jones, Simon; Sulzmann, Martin; Vytiniotis, Dimitrios (2009). „Úplné a rozhodné odvození typu pro GADT“ (PDF). Sborník mezinárodní konference ACM o funkčním programování (ICFP'09), Edinburgh.CS1 maint: ref = harv (odkaz)
- Lin, Chuan-kai (2010). Praktická odvození typu pro systém typů GADT (PDF) (Disertační práce). Státní univerzita v Portlandu.CS1 maint: ref = harv (odkaz)
- jiný
- Andrew Kennedy a Claudio V. Russo. "Zobecněné algebraické datové typy a objektově orientované programování". Ve sborníku z 20. ročníku konference ACM SIGPLAN o objektově orientovaném programování, systémech, jazycích a aplikacích. ACM Press, 2005.
externí odkazy
- Stránka zobecněného algebraického datového typu na Haskellu wiki
- Zobecněné algebraické datové typy v Uživatelské příručce GHC
- Zobecněné algebraické datové typy a objektově orientované programování
- GADTs - Haskell Prime - Trac
- Články o odvozování typu pro GADT, bibliografie od Simon Peyton Jones
- Zadejte odvození s omezeními, bibliografie od Simon Peyton Jones
- Emulace GADT v Javě prostřednictvím lemmatu Yoneda