2

我正在尝试使具体化(使用Data.Reflection)类型成为 Typeable 的实例。

newtype Zq q = Zq Int

我可以为 派生一个Typeable1实例Zq,但这带有隐式约束(Typeable q)。我想Zq q在需要参数为的函数中使用类型值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哪里,成为. 我知道这样做的唯一方法就是制作。当然,如果我 reify 42 to然后 reify 43 to ,这些不应该是相等的类型。另一方面,我意识到我不能期望两个不同的类型变量将相同的值具体化为具有相同的 TypeReps(即使在实践中它们是相同的)。qTypeableq Typeableq1q2

4

1 回答 1

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是不同的,也可以相互转换,您只需手动编写一个实例Typeable (Zq a)。返回typeOf一个TypeRep自动生成的实例

newtype Zq = Zq Int

会回来的。

免责声明:老实说,我不知道我在说什么!

于 2013-07-22T19:13:39.577 回答