Haskell Language
Tipos de datos algebraicos generalizados
Buscar..
Uso básico
Cuando la extensión GADTs
está habilitada, además de las declaraciones de datos regulares, también puede declarar tipos de datos algebraicos generalizados de la siguiente manera:
data DataType a where
Constr1 :: Int -> a -> Foo a -> DataType a
Constr2 :: Show a => a -> DataType a
Constr3 :: DataType Int
Una declaración GADT enumera los tipos de todos los constructores que tiene un tipo de datos, explícitamente. A diferencia de las declaraciones de tipos de datos regulares, el tipo de un constructor puede ser cualquier función N-ary (incluyendo nullary) que finalmente resulte en el tipo de datos aplicado a algunos argumentos.
En este caso, hemos declarado que el tipo DataType
tiene tres constructores: Constr1
, Constr2
y Constr3
.
El constructor Constr1
no es diferente de uno declarado utilizando una declaración de datos regular: data DataType a = Constr1 Int a (Foo a) | ...
Constr2
embargo, Constr2
requiere que a
tenga una instancia de Show
, por lo tanto, al usar el constructor, la instancia debería existir. Por otro lado, cuando la concordancia de patrones en él, el hecho de que a
es una instancia de Show
entra en su alcance, para que pueda escribir:
foo :: DataType a -> String
foo val = case val of
Constr2 x -> show x
...
Tenga en cuenta que la función Show a
restricción no aparece en el tipo de la función, y solo está visible en el código a la derecha de ->
.
Constr3
tiene el tipo DataType Int
, lo que significa que cada vez que un valor del tipo DataType a
es un Constr3
, se sabe que a ~ Int
. Esta información también se puede recuperar con una coincidencia de patrón.