【问题标题】:Defining your own Typeable instances for GADTs为 GADT 定义您自己的 Typeable 实例
【发布时间】:2011-10-13 14:05:38
【问题描述】:

有人可以指出一组很好的示例,用于在 Haskell 中为 GADT 定义 Typeable 或 Typeable1 实例。

或者,谁能告诉我如何为以下 GADT 定义 Typeable(手动)。

data V a where
    Unit :: V () 
    Pair :: V a -> V b -> V (a, b) 
    L :: V a -> V (Either a b) 
    R :: V b -> V (Either a b) 
    Fresh :: Int -> V a

另外,指向介绍该想法的论文的指针也会有所帮助。

【问题讨论】:

    标签: haskell type-conversion ghc gadt


    【解决方案1】:

    现在好像网站没了,但是回程机上还有链接到所有原始论文的网站:http://web.archive.org/web/20080622204226/http://www.cs.vu.nl/boilerplate/

    无论如何,Typeable 几乎完全是机械的。即使对于 GADT,您也可以通过 DeriveDataTypeable 扩展导出它。至少当类型是* -> * 时,如您的示例所示。

    我还可以举一个手动提供 Typeable1 实例的例子,但它会在 GHC 的下一个版本中被弃用。用于手动创建实例的界面正在发生变化。

    {-# NOINLINE vTyCon #-}
    vTyCon :: TyCon
    vTyCon = mkTyCon "ModuleName.V"
    
    instance Typeable1 V where
        typeOf1 _ = mkTyConApp vTyCon []
    

    NOINLINE 编译指示实际上很重要,因为 mkTyCon 在后台做了不安全的事情。这就是为什么最好让 GHC 手动派生实例,如果可能的话。

    我的理解是,在 GHC 的未来版本中将改变的部分是您应该使用不同的函数 mkTyCon3,它将包名称、模块名称和类型名称作为单独的参数。这是一个明显的改进,即使支持多个版本的 GHC 变得更加困难。见:Changes to Data.Typeable

    以上所有内容都很旧。

    来自 GHC 文档:

    此外,从 GHC 7.8.1 开始,Typeable 的手写(即非派生)实例被禁止,并且会导致错误。

    您永远不需要,甚至不应该被允许使用任何现代版本的 GHC 手动编写 Typeable 实例。事实上,您甚至不需要告诉 GHC 导出它们 - 它会自动完成。

    【讨论】:

      猜你喜欢
      • 2014-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多