34

現在、GHC を使用したジェネリック プログラミングには 2 つ (TemplateHaskell を数えると 3 つ) のオプションがあり、Data.Data / Data.TypeableGHC.Genericsがあり、どちらも基本パッケージから利用できます。それでは、それぞれの長所と短所は何ですか?GHC.Generics は「最新の」方法であり、Data.Data は廃止され、後方互換性のために保持されているだけですか?

4

1 に答える 1

28

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]

その後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)

そして、次の署名で特定のtoJSONfromを使用します。Data.Aeson.Generic

toJSON :: Data a => a -> Value
于 2013-07-06T13:28:23.003 に答える