`deriving(Data)`vs`deferred(Generic)`

时间:2014-09-29 03:44:00

标签: haskell ghc

这两者在GHC中的区别是什么。它们在预期目的上似乎相似,但deriving (Data)已存在一段时间,但deriving (Generic)最近才被添加到GHC。

deriving (Generic)基本上是"升级"到deriving (Data)或两个类有不同的目的吗?

1 个答案:

答案 0 :(得分:1)

我几乎毫不犹豫地回答这个问题,因为我自己只是稍微了解一下,但是大约一年前我确实花了几天时间看这个,这是我目前的理解....

这两个类都用于内省....使用它们,您可以访问Haskell代码解析器(Haskell程序本身)。

然而,哲学上,他们这样做的方式不同。

  1. derived(Data)创建数据对象,表示可在运行时操作的已解析对象树。

  2. derived(Generic)创建对应于每个parsetree的新类型,通常可以在编译时进行操作(在运行时完成的工作量较少)。

  3. 从我有限的用法来看,“派生(数据)”使用起来要简单得多,但当然在运行时并不那么圆滑(对我而言......这是可以忽略的)。

    尽管“推导(通用)”在理论上更快,但编程更为棘手,并且涉及创建可以操纵类型组(即相关的分析树)的类。它也可能会促使您使用尖端的GHC扩展。

    我的观点 - “衍生(通用)”是做事的“正确”方式,但需要更长时间才能掌握。

    模板Haskell是另一种访问Haskell分析树的方法,虽然它在编译时100%工作,并且有工具让你创建插入解析树数据到代码中(即生成代码的代码,如Lisp宏)。

    再一次,让我强调这一切都是基于几天的研究,所以如果我把这种情况严重损坏,有人让我知道(我自己想要坚定我的理解)。