Articulo de referencia

Tipo de datos algebraicos generalizados

En programación funcional , un tipo de datos algebraico generalizado ( GADT , también tipo fantasma de primera clase , [ 1 ] tipo de datos recursivo protegido , [ 2 ] o tipo cal...

En programación funcional , un tipo de datos algebraico generalizado ( GADT , también tipo fantasma de primera clase , [ 1 ] tipo de datos recursivo protegido , [ 2 ] o tipo calificado de igualdad [ 3 ] ) es una generalización de un tipo de datos algebraico paramétrico (ADT).

Descripción general

En un GADT, los constructores de producto (denominados constructores de datos en Haskell ) pueden proporcionar una instanciación explícita del ADT como instanciación de tipo de su valor de retorno. Esto permite definir funciones con un comportamiento de tipo más avanzado. Para un constructor de datos de Haskell 2010, el valor de retorno tiene la instanciación de tipo implícita en la instanciación de los parámetros del ADT en la aplicación del constructor.

-- Un ADT paramétrico que no es un GADT Lista de datos a = Nil | Cons a ( Lista a )enteros :: Lista Int enteros = Cons 12 ( Cons 107 Nil )cadenas :: Lista Cadena cadenas = Cons "barco" ( Cons "muelle" Nil )-- Un GADT de datos Expr a donde EBool :: Bool -> Expr Bool EInt :: Int -> Expr Int EEqual :: Expr Int -> Expr Int -> Expr Booleval :: Expr a -> a eval e = case e of EBool a -> a EInt a -> a EEqual a b -> ( eval a ) == ( eval b )expr1 :: Expr Bool expr1 = EEqual ( EInt 2 ) ( EInt 3 )ret = eval expr1 -- Falso

Actualmente se implementan en el compilador Glasgow Haskell (GHC) como una extensión no estándar, utilizada, entre otros, por Pugs y Darcs . OCaml admite GADT de forma nativa desde la versión 4.00. [ 4 ]

La implementación de GHC ofrece soporte para parámetros de tipo cuantificados existencialmente y para restricciones locales.

Historia

Una versión temprana de los tipos de datos algebraicos generalizados fue descrita por Augustsson y Petersson (1994) y se basaba en la coincidencia de patrones en ALF .

Los tipos de datos algebraicos generalizados fueron introducidos independientemente por Cheney y Hinze (2003) y previamente por Xi, Chen y Chen (2003) como extensiones de los tipos de datos algebraicos de ML y Haskell . [ 5 ] Ambos son esencialmente equivalentes entre sí. Son similares a las familias inductivas de tipos de datos (o tipos de datos inductivos ) que se encuentran en el Cálculo de Construcciones Inductivas de Rocq y otros lenguajes con tipos dependientes , módulo los tipos dependientes y excepto que estos últimos tienen una restricción de positividad adicional que no se aplica en los GADT. [ 6 ]

Sulzmann, Wazny y Stuckey (2006) introdujeron tipos de datos algebraicos extendidos que combinan GADT con tipos de datos existenciales y restricciones de clase de tipos .

La inferencia de tipos en ausencia de cualquier anotación de tipo proporcionada por el programador es indecidible [ 7 ] y las funciones definidas sobre GADT no admiten tipos principales en general. [ 8 ] La reconstrucción de tipos requiere varias compensaciones de diseño y es un área de investigación activa ( Peyton Jones, Washburn y Weirich 2004 ; Peyton Jones et al. 2006 ).

En la primavera de 2021, se lanzó Scala 3.0. [ 9 ] Esta importante actualización de Scala introdujo la posibilidad de escribir GADT [ 10 ] con la misma sintaxis que los tipos de datos algebraicos, lo cual no ocurre en otros lenguajes de programación según Martin Odersky . [ 11 ]

Aplicaciones

Las aplicaciones de GADT incluyen la programación genérica , el modelado de lenguajes de programación ( sintaxis abstracta de orden superior ), el mantenimiento de invariantes en estructuras de datos , la expresión de restricciones en lenguajes específicos de dominio embebidos y el modelado de objetos. [ 12 ]

Sintaxis abstracta de orden superior

Una aplicación importante de los GADT es la de integrar sintaxis abstracta de orden superior de forma segura en cuanto a tipos . Aquí se muestra una integración del cálculo lambda simplemente tipado con una colección arbitraria de tipos base, tipos producto ( tuplas ) y un combinador de punto fijo :

datos Lam :: * -> * donde Lift :: a -> Lam a -- ^ valor elevado Pair :: Lam a -> Lam b -> Lam ( a , b ) -- ^ producto Lam :: ( Lam a -> Lam b ) -> Lam ( a -> b ) -- ^ abstracción lambda App :: Lam ( a -> b ) -> Lam a -> Lam b -- ^ aplicación de función Fix :: Lam ( a -> a ) -> Lam a -- ^ punto fijo

Y una función de evaluación con tipado seguro:

eval :: Lam t -> t eval ( Lift v ) = v eval ( Pair l r ) = ( eval l , eval r ) eval ( Lam f ) = \ x -> eval ( f ( Lift x )) eval ( App f x ) = ( eval f ) ( eval x ) eval ( Fix f ) = ( eval f ) ( eval ( Fix f ))

La función factorial ahora se puede escribir como:

hecho = Arreglar ( Lam ( \ f -> Lam ( \ y -> Levantar ( si eval y == 0 entonces 1 sino eval y * ( eval f ) ( eval y - 1 ))))) eval ( hecho )( 10 )

Se habrían producido problemas al usar tipos de datos algebraicos regulares. Eliminar el parámetro de tipo habría hecho que los tipos base elevados se cuantificaran existencialmente, lo que haría imposible escribir el evaluador. Con un parámetro de tipo, sigue estando restringido a un solo tipo base. Además, App (Lam (\x -> Lam (\y -> App x y))) (Lift True)habría sido posible construir expresiones mal formadas como , mientras que son incorrectas en cuanto al tipo usando GADT. Un análogo bien formado es App (Lam (\x -> Lam (\y -> App x y))) (Lift (\z -> True)). Esto se debe a que el tipo de xes Lam (a -> b), inferido del tipo del Lamconstructor de datos.

Véase también

Notas

  1. Cheney y Hinze 2003 .
  2. ^ Xi, Chen y Chen 2003 .
  3. Sheard y Pasalic 2004 .
  4. "OCaml 4.00.1" . ocaml.org .
  5. ^ Cheney y Hinze 2003 , pág. 25.
  6. ^ Cheney y Hinze 2003 , págs .
  7. ^ Peyton Jones, Washburn y Weirich 2004 , pág. 7.
  8. Schrijvers y col. 2009 , pág. 1.
  9. ^ Kmetiuk, Anatolii. "¡Scala 3 ya está aquí!" . scala-lang.org . École Polytechnique Fédérale Lausanne (EPFL) Lausana, Suiza . Consultado el 19 de mayo de 2021 .
  10. ^ "Scala 3 - Libro de tipos de datos algebraicos" . scala-lang.org . École Polytechnique Fédérale Lausanne (EPFL) Lausana, Suiza . Consultado el 19 de mayo de 2021 .
  11. Odersky, Martin. "Un recorrido por Scala 3 – Martin Odersky" . youtube.com . Conferencias Scala Days. Archivado del original el 19 de diciembre de 2021. Consultado el 19 de mayo de 2021 .
  12. ^ Peyton Jones, Washburn y Weirich 2004 , pág. 3.

Lecturas adicionales

Aplicaciones
  • Augustsson, Lennart ; Petersson, Kent (septiembre de 1994). "Familias tipo tontas" (PDF) .
  • Cheney, James ; Hinze, Ralf (2003). "Tipos fantasma de primera clase". Informe técnico CUCIS TR2003-1901 . Universidad de Cornell. hdl : 1813/5614 .
  • Xi, Hongwei ; Chen, Chiyan ; Chen, Gang (2003). «Constructores de tipos de datos recursivos protegidos». Actas del 30.º simposio ACM SIGPLAN-SIGACT sobre principios de lenguajes de programación . ACM Press. págs. 224-235 . CiteSeerX 10.1.1.59.4622 . doi : 10.1145/604131.604150 . ISBN   978-1581136289. S2CID 15095297 . 
  • Sheard, Tim ; Pasalic, Emir (2004). "Metaprogramación con igualdad de tipos integrada" . Actas del Cuarto Taller Internacional sobre Marcos Lógicos y Metalenguajes (LFM'04), Cork . 199 : 49–65 . doi : 10.1016/j.entcs.2007.11.012 .
Semántica
  • Patricia Johann y Neil Ghani (2008). " Fundamentos para la programación estructurada con GADT ".
  • Arie Middelkoop, Atze Dijkstra y S. Doaitse Swierstra (2011). " Una especificación ligera para GADT: sistema F con pruebas de igualdad de primera clase ". Higher-Order and Symbolic Computation .
Reconstrucción de tipo
Otro
  • Andrew Kennedy y Claudio V. Russo. « Tipos de datos algebraicos generalizados y programación orientada a objetos ». En Actas de la 20.ª conferencia anual ACM SIGPLAN sobre programación orientada a objetos, sistemas, lenguajes y aplicaciones . ACM Press, 2005.
  • Página sobre tipos de datos algebraicos generalizados en la wiki de Haskell
  • Tipos de datos algebraicos generalizados en la Guía del usuario de GHC
  • Tipos de datos algebraicos generalizados y programación orientada a objetos
  • GADTs  – Haskell Prime  – Trac Archivado el 4 de abril de 2019 en Wayback Machine
  • Artículos sobre inferencia de tipos para GADT , bibliografía de Simon Peyton Jones
  • Inferencia de tipos con restricciones , bibliografía de Simon Peyton Jones
  • Emulando GADTs en Java mediante el lema de Yoneda