estoy usando GHCi 7.0.3 con el siguiente programa que implementa la lista de nivel Tipo:XTypeOperators no funciona como pragma
{-# LANGUAGE TypeOperators #-}
data True
data False
-- List
data Nil
data Cons x xs
-- Type-level infix operator must begin with ':'
data x ::: xs
infixr 5 ::: -- set precedence level to 5 (tight)
Compila, pero cuando lo pruebo con:
:t (undefined :: True:::Nil)
(¿cuál es el tipo de undefined
cuando se lanza a escribir True:::Nil
?) me sale este error:
Illegal operator `:::' in type `True ::: Nil'
Use -XTypeOperators to allow operators in types
Y de hecho, cuando comienzo GHCi con la bandera
-XTypeOperators
puedo obtener el resultado esperado:
(undefined :: True ::: Nil) :: True ::: Nil
Mi pregunta es: ¿Por qué no hace el trabajo equivalente pragma:
{-# LANGUAGE TypeOperators #-}
Editar: Si los pragmas no se extienden al entorno GHCi que tengo otro acertijo. Probé este programa:
class And b1 b2 b | b1 b2 -> b where
andf :: b1 -> b2 -> b
-- truth table
instance And True True True where andf = undefined
instance And True False False where andf = undefined
instance And False True False where andf = undefined
instance And False False False where andf = undefined
Se requieren los siguientes pragmas:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
Pero una vez compilado, pude utilizarlo en GHCi:
*Main> :t andf (undefined::True) (undefined::False)
andf (undefined::True) (undefined::False) :: False
supongo que en el caso de la lista de la el intérprete ni siquiera podía analizar la expresión con el operador de nivel de tipo :::
, mientras que en el caso de las clases de multiparámetros, la línea de comando era parseable. Pero, pensándolo bien, GHCi realizó la inferencia de tipos utilizando clases de parámetros múltiples y dependencias funcionales, ¿no es así? Esta inferencia tipo se hace en GHCi, y no llamando a alguna función en el código compilado, ¿verdad?
+1 para el archivo .ghci –