我正在尝试使具体化(使用Data.Reflection)类型成为 Typeable 的实例。
newtype Zq q = Zq Int
我可以为 派生一个Typeable1
实例Zq
,但这带有隐式约束(Typeable q)
。我想Zq q
在需要参数为的函数中使用类型值Typeable
。所以有几个问题:
- 有没有办法制作一个具体的类型
Typeable
? - 如果没有,有没有办法修改现有的库以允许这样做?
- 一般来说,可以制作哪些类型
Typeable
?似乎通过使用DeriveDataTypeable
andStandaloneDeriving
,我能想到的任何具体类型(除了像具体类型这样的临时类型)都可以作为实例。
编辑 我正在谈论的代码片段:
f = reify (42::Int) (\ (_::Proxy q) ->
let x = Zq 15 :: Zq q -- x = 15 mod 42
in ...
我想,具体化类型在Zq q
哪里,成为. 我知道这样做的唯一方法就是制作。当然,如果我 reify 42 to然后 reify 43 to ,这些不应该是相等的类型。另一方面,我意识到我不能期望两个不同的类型变量将相同的值具体化为具有相同的 TypeReps(即使在实践中它们是相同的)。q
Typeable
q
Typeable
q1
q2