Dado un lenguaje sencillo, dicenLa transformación de la representación sin tipo de DSL en representación mecanografiado
data E where
ValE :: Typeable a => a -> E
AppE :: E -> E -> E
es entonces posible transformarla en una representación escrito:
data T a where
ValT :: Typeable a => a -> T a
AppT :: T (a -> b) -> T a -> T b
deriving Typeable
He intentado varios enfoques, p.ej lo siguiente:
e2t :: Typeable a => E -> Maybe (T a)
e2t (ValE x) = cast (ValT x)
e2t (AppE e1 e2) = liftM2 AppT (e2t e1) (e2t e2)
Esto no funciona, y me sale el siguiente mensaje de error:
tipo ambiguo variable 'a' en la restricción:
'tipificables un'
que surge de una uso de `e2t' en ...
solución probable: añadir una firma tipo que fija estas variables (s) tipo de
Sin embargo, si me gusta esta
e2t :: Typeable a => E -> Maybe (T a)
e2t (ValE x) = cast (ValT x)
e2t (AppE e1 e2) = liftM2 AppT (e2t e1) (e2t e2 :: Maybe (T Int))
compila.