eine einfache Sprache gegeben Transforming, sagennicht typisierten Darstellung eines DSL in getippten Darstellung
data E where
ValE :: Typeable a => a -> E
AppE :: E -> E -> E
ist es dann möglich, sie in eine typisierte Darstellung zu transformieren:
data T a where
ValT :: Typeable a => a -> T a
AppT :: T (a -> b) -> T a -> T b
deriving Typeable
ich verschiedene Ansätze versucht haben, z.B die folgenden:
e2t :: Typeable a => E -> Maybe (T a)
e2t (ValE x) = cast (ValT x)
e2t (AppE e1 e2) = liftM2 AppT (e2t e1) (e2t e2)
Das funktioniert nicht, und ich erhalte die folgende Fehlermeldung:
Mehrdeutige Variable vom Typ 'a' in der Einschränkung:
'typisierbarem eine'
von einem entstehenden Verwendung von `E2T‘ an ...
Wahrscheinliche fix: eine Art Signatur hinzufügen, die diese Variable vom Typ fixiert (s)
wenn ich aber wie diese
tune2t :: 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))
es kompiliert.