簡體   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