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

Cli*_*ton 6 haskell ghc

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

deriving (Generic)基本上是一个"升级"到deriving (Data)或者做两个班有不同的用途?

jam*_*idh 3

我几乎犹豫要不要回答这个问题,因为我自己对它的了解也很少,但大约一年前我自己确实花了几天时间看这个问题,这是我目前的理解......

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

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

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

  2. deriving (Generic) 创建与每个解析树相对应的新类型,这些新类型通常可以在编译时进行操作(在运行时需要完成的工作更少)。

从我有限的使用来看,“导出(数据)”使用起来更加简单,但当然在运行时并不那么流畅(......对我来说,这是可以忽略不计的)。

虽然“派生(通用)”理论上更快,但编程起来比较棘手,并且涉及创建可以操作类型组(即相关解析树)的类。它还可能会促使您使用最先进的 GHC 扩展。

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

Template Haskell 是访问 Haskell 解析树的另一种方法,尽管它在编译时可以 100% 工作,并且具有允许您创建解析树数据并将其插入到代码中的工具(即生成代码的代码,如 Lisp 宏)。

再次,让我强调一下,这都是基于几天的研究,所以如果我把这个搞得太严重了,有人让我知道(我自己想巩固我的理解)。

  • 派生“Data”创建“Data”字典(类型类实例),它提供在对象树(特别是“gfoldl”)上工作的高阶函数。另外,恕我直言,“Generic”比“Data”更容易使用,并且代码也更简单。 (2认同)