Cho một ngôn ngữ đơn giản, nóiChuyển đổi đại diện untyped của một DSL vào biểu gõ
data E where
ValE :: Typeable a => a -> E
AppE :: E -> E -> E
là nó sau đó có thể để biến nó thành một đại diện gõ:
data T a where
ValT :: Typeable a => a -> T a
AppT :: T (a -> b) -> T a -> T b
deriving Typeable
Tôi đã thử các cách tiếp cận khác nhau, ví dụ như sau:
e2t :: Typeable a => E -> Maybe (T a)
e2t (ValE x) = cast (ValT x)
e2t (AppE e1 e2) = liftM2 AppT (e2t e1) (e2t e2)
này không làm việc, và tôi nhận được thông báo lỗi sau:
mơ hồ kiểu biến 'a' trong ràng buộc:
'Typeable một'
phát sinh từ một sử dụng của `e2t' tại ...
sửa chữa dự kiến: thêm một chữ ký kiểu đó sửa chữa các loại biến (s)
Tuy nhiên, nếu tôi làm như
nàye2t :: 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))
nó biên dịch.