haskell types ghc type-inference type-families

Familias de tipo cerrado e inferencia de tipo en Haskell



types ghc (1)

En GHC-7.7 (y 7.8) se introdujeron familias de tipo cerrado:

Una familia de tipo cerrado tiene todas sus ecuaciones definidas en un solo lugar y no se puede ampliar, mientras que una familia abierta puede tener instancias repartidas entre módulos. La ventaja de una familia cerrada es que sus ecuaciones se intentan en orden, similar a una definición de función de nivel de término

Quiero preguntarte, ¿por qué el siguiente código no se compila? GHC debería poder inferir todos los tipos: GetTheType se define solo para el tipo X y si comentamos la línea marcada, el código se compila.

¿Se trata de un error en GHC o las familias de tipo cerrado no tienen tales optimizaciones AÚN?

código:

{-# LANGUAGE TypeFamilies #-} data X = X type family GetTheType a where GetTheType X = X class TC a where tc :: GetTheType a -> Int instance TC X where tc X = 5 main = do -- if we comment out the following line, the code compiles let x = tc X print "hello"

Y el error es:

Couldn''t match expected type ‛GetTheType a0’ with actual type ‛X’ The type variable ‛a0’ is ambiguous In the first argument of ‛tc’, namely ‛X’ In the expression: tc X


No hay nada malo con las familias de tipo cerrado. El problema es que las funciones tipográficas no son inyectivas.

Digamos, usted podría tener esta función de tipo cerrado:

data X = X data Y = Y type family GetTheType a where GetTheType X = X GetTheType Y = X

no se puede inferir el tipo de argumento del tipo de resultado X

Las familias de datos son inyectivas, pero no cerradas:

{-# LANGUAGE TypeFamilies #-} data X = X data family GetTheType a data instance GetTheType X = RX class TC a where tc :: (GetTheType a) -> Int instance TC X where tc RX = 5 main = do let x = tc RX print "hello"