2

( Data.Reflectionを使用して) 具体化された型を Typeable のインスタンスにしようとしています。

newtype Zq q = Zq Int

Typeable1のインスタンスを導出できますZqが、これには暗黙の制約が伴います(Typeable q)Zq q引数が である必要がある関数で type の値を使用したいTypeable。そこでいくつか質問があります:

  1. 具体化された型を作成する方法はありますTypeableか?
  2. そうでない場合、これを可能にするために既存のライブラリを変更する方法はありますか?
  3. 一般的に、どのようなタイプを作ることができTypeableますか? DeriveDataTypeableandを使用することでStandaloneDeriving、私が考えることができる具体的な型 (具体化された型のような一時的な型は別として) をインスタンスにすることができるようです。

私が話していることの編集コードスニペット:

f = reify (42::Int) (\ (_::Proxy q) ->
  let x = Zq 15 :: Zq q -- x = 15 mod 42
  in ... 

具体化さZq qれた型である を のインスタンスにしたいと思います。私がこれを行う唯一の方法は、同様に作成することです。もちろん、42 を に具体化し、次に 43 を に具体化した場合、これらは同じ型であってはなりません。一方で、同じ値を具体化する 2 つの異なる型変数が等しい TypeReps を持つとは期待できないことを認識しています (実際には同じですが)。qTypeableq Typeableq1q2

4

1 に答える 1