给定一种简单的语言,说
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)
这不起作用,我收到以下错误消息:
约束中的模棱两可的类型变量 'a':
'Typeable a'
源于在 ... 使用 '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))
它编译。