簡単な言語を考えると、
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))
コンパイルします。