( Data.Reflectionを使用して) 具体化された型を Typeable のインスタンスにしようとしています。
newtype Zq q = Zq Int
Typeable1
のインスタンスを導出できますZq
が、これには暗黙の制約が伴います(Typeable q)
。Zq q
引数が である必要がある関数で type の値を使用したいTypeable
。そこでいくつか質問があります:
- 具体化された型を作成する方法はあります
Typeable
か? - そうでない場合、これを可能にするために既存のライブラリを変更する方法はありますか?
- 一般的に、どのようなタイプを作ることができ
Typeable
ますか?DeriveDataTypeable
andを使用することでStandaloneDeriving
、私が考えることができる具体的な型 (具体化された型のような一時的な型は別として) をインスタンスにすることができるようです。
私が話していることの編集コードスニペット:
f = reify (42::Int) (\ (_::Proxy q) ->
let x = Zq 15 :: Zq q -- x = 15 mod 42
in ...
が具体化さZq q
れた型である を のインスタンスにしたいと思います。私がこれを行う唯一の方法は、同様に作成することです。もちろん、42 を に具体化し、次に 43 を に具体化した場合、これらは同じ型であってはなりません。一方で、同じ値を具体化する 2 つの異なる型変数が等しい TypeReps を持つとは期待できないことを認識しています (実際には同じですが)。q
Typeable
q
Typeable
q1
q2