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.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow