繁体   English   中英

GHC.Generics还是Data.Data?

[英]GHC.Generics or Data.Data?

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

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

aeson库的记录序列化到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]

并使用toJSONToJSON类型类之后。

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM