Учитывая простой язык, скажутПреобразования нетипизированного представления DSL в типизированное представление
data E where
ValE :: Typeable a => a -> E
AppE :: E -> E -> E
это тогда можно превратить его в типизированном представление:
data T a where
ValT :: Typeable a => a -> T a
AppT :: T (a -> b) -> T a -> T b
deriving Typeable
Я пробовал различные подходы, например следующее:
e2t :: Typeable a => E -> Maybe (T a)
e2t (ValE x) = cast (ValT x)
e2t (AppE e1 e2) = liftM2 AppT (e2t e1) (e2t e2)
Это не работает, и я получаю следующее сообщение об ошибке:
Неопределенный тип переменной «а» в ограничении:
«печатаемые а»
, вытекающее из использование `e2T» на ...
Возможная ошибка: добавить сигнатуру типа, который фиксирует эти типа переменной (ы)
Однако, если я, как этот
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))
компилируется.