Dato un linguaggio semplice, diconoTrasformare la rappresentazione senza tipo di un DSL in rappresentanza digitato
data E where
ValE :: Typeable a => a -> E
AppE :: E -> E -> E
è allora possibile trasformarlo in una rappresentazione digitato:
data T a where
ValT :: Typeable a => a -> T a
AppT :: T (a -> b) -> T a -> T b
deriving Typeable
ho provato vari approcci, per esempio il seguente:
e2t :: Typeable a => E -> Maybe (T a)
e2t (ValE x) = cast (ValT x)
e2t (AppE e1 e2) = liftM2 AppT (e2t e1) (e2t e2)
Questo non funziona, e ottengo il seguente messaggio di errore:
tipo ambiguo variabile 'a' nel vincolo:
'tipizzabile un'
derivante da una uso di `E2T' a ...
correzione probabile: aggiungere una firma tipo che consente di risolvere questi variabile di tipo (s)
Tuttavia, se mi piace questo
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.