临时类型的可键实例

时间:2013-07-22 17:27:10

标签: haskell reflection

我正在尝试使用Data.Reflection)来设置Typeable的实例。

newtype Zq q = Zq Int

我可以为Typeable1派生Zq个实例,但这带有隐式约束(Typeable q)。我想在函数中使用类型Zq q的值,该函数要求参数为Typeable。所以有一些问题:

  1. 有没有办法制作具体型Typeable
  2. 如果没有,有没有办法修改现有的库以允许这个?
  3. 一般来说,哪些类型的可以成为Typeable?似乎通过使用DeriveDataTypeableStandaloneDeriving,我能想到的任何具体类型(除了像reified类型这样的临时类型)都可以是一个实例。
  4. 修改 我正在谈论的代码片段:

    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(即使在实践中它们是相同的)。

1 个答案:

答案 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 qZq q1可以相互转换,即使qq1不同,您只需编写一个{{1}的实例} 用手。让Typeable (Zq a)返回typeOf自动生成的

实例
TypeRep

会回来。

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