我正在尝试使用Data.Reflection)来设置Typeable的实例。
newtype Zq q = Zq Int
我可以为Typeable1
派生Zq
个实例,但这带有隐式约束(Typeable q)
。我想在函数中使用类型Zq q
的值,该函数要求参数为Typeable
。所以有一些问题:
Typeable
? Typeable
?似乎通过使用DeriveDataTypeable
和StandaloneDeriving
,我能想到的任何具体类型(除了像reified类型这样的临时类型)都可以是一个实例。修改 我正在谈论的代码片段:
f = reify (42::Int) (\ (_::Proxy q) ->
let x = Zq 15 :: Zq q -- x = 15 mod 42
in ...
我希望Zq q
q
是具体化类型,成为Typeable
的实例。我知道这样做的唯一方法是制作q
Typeable
。当然,如果我将42复制到q1
然后将43复制到q2
,则这些不应该是相同的类型。另一方面,我意识到我不能指望两个不同的类型变量,它们将相同的值重新设置为具有相同的TypeReps(即使在实践中它们是相同的)。
答案 0 :(得分:1)
取决于。
*Main> :t (Zq 42, Zq 42)
(Zq 42, Zq 42) :: (Zq q, Zq q1)
*Main> :t [Zq 42, Zq 42]
[Zq 42, Zq 42] :: [Zq q]
*Main>
该对的元素具有不同的类型,而列表的元素在自然界中具有相同的类型。这里不足为奇。
如果你想保持这种方式,似乎无法使Zq q
可输入。 Typeable
的重点是相同的类型获得相同的表示,而不同的类型获得不同的表示。幻影类型的重点恰恰相反,在每个机会产生一种新的独特类型。类型类机制不支持这种滥用。每当我们的值绑定到具有新类型变量的东西时,我们就需要一个新的唯一TypeRep
。
OTOH如果您希望Zq q
和Zq q1
可以相互转换,即使q
和q1
不同,您只需编写一个{{1}的实例} 用手。让Typeable (Zq a)
返回typeOf
自动生成的
TypeRep
会回来。
免责声明:我不知道我在说什么,说实话!