GHC.Generics还是Data.Data?

时间:2013-07-06 11:42:24

标签: generics haskell

目前有2个(如果你计算了3个TemplateHaskell)选项用于使用GHC的通用编程,Data.Data / Data.TypeableGHC.Generics都可以从基础包中获得。那么,每个的优点和缺点是什么? GHC.Generics是“现代”的方式,Data.Data是过时的,只是为了向后兼容而保留?

1 个答案:

答案 0 :(得分:27)

GHC.Generics是现代方式,它比SYB快得多。然而,它向最终用户公开了一种不同的通用编程方法,所以我认为它不应该被认为是SYB的直接替代,尽管它确实解决了同样的问题。

这些方法与用户视角的不同之处的一个很好的例子可以从aeson library的记录序列化功能中提取到JSON:

没有泛型

{-# LANGUAGE OverloadedStrings #-}
import Data.Aeson

data Coord = Coord { x :: Double, y :: Double }

instance ToJSON Coord where
   toJSON (Coord x y) = object ["x" .= x, "y" .= y]

然后使用ToJSON类型toJSON

使用GHC.Generics

{-# LANGUAGE DeriveGeneric #-}
import Data.Aeson    
import GHC.Generics

data Coord = Coord { x :: Double, y :: Double } deriving Generic

instance ToJSON Coord

然后使用相同的toJSON ToJSON类型类。

使用SYB

{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Aeson.Generic

data Coord = Coord { x :: Double, y :: Double } deriving (Data, Typeable)

并使用Data.Aeson.Generic中具有以下签名的特定toJSON

toJSON :: Data a => a -> Value