目前有 2 个(如果算上 TemplateHaskell,则为 3 个)使用 GHC 进行泛型编程的选项,Data.Data / Data.Typeable和GHC.Generics,这两个选项都可以从基本包中获得。那么,各有什么优缺点呢?GHC.Generics 是“现代”方式,而 Data.Data 是否已过时,只是为了向后兼容而保留?
问问题
2902 次
1 回答
28
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)
并使用具有以下签名的特定toJSON
from :Data.Aeson.Generic
toJSON :: Data a => a -> Value
于 2013-07-06T13:28:23.003 回答