コンストラクターに特定の制約のない GADT を、その制約を持つ GADT に変換できますか? 私がこれをしたいのは、矢印の深い埋め込みを取得し、(今のところ) が必要と思われる表現でいくつかの興味深いことをしたいからですTypeable
。(理由は一つ)
data DSL a b where
Id :: DSL a a
Comp :: DSL b c -> DSL a b -> DSL a c
-- Other constructors for Arrow(Loop,Apply,etc)
data DSL2 a b where
Id2 :: (Typeable a, Typeable b) => DSL2 a a
Comp2 :: (Typeable a, Typeable b, Typeable c) => DSL2 b c -> DSL2 a b -> DSL2 a c
-- ...
次の関数を試すこともできますが、再帰ポイントfrom
の情報がないため、すぐに機能しなくなります。
Typeable
from :: (Typeable a, Typeable b) => DSL a b -> DSL2 a b
from (Id) = Id2
from (Comp g f) = Comp2 (from g) (from f)
代わりに、型クラスで変換をキャプチャしようとします。しかし、それは破綻するだけでなく、実存的なTypeable b
情報を失うことにもなります。b
class From a b where
from :: a -> b
instance (Typeable a, Typeable b) => From (DSL a b) (DSL2 a b) where
from (Id) = Id2
from (Comp g f) = Comp2 (from g) (from f)
他の提案はありますか?最終的には、型パラメーターに関する情報Category
とArrow
一緒に深い埋め込みを作成したいと考えています。Typeable
これは、アロー構文を使用して DSL で値を構築し、かなり標準的な Haskell コードを持つことができるようにするためです。多分私は Template Haskell に頼らなければなりませんか?