現在、GHC を使用したジェネリック プログラミングには 2 つ (TemplateHaskell を数えると 3 つ) のオプションがあり、Data.Data / Data.TypeableとGHC.Genericsがあり、どちらも基本パッケージから利用できます。それでは、それぞれの長所と短所は何ですか?GHC.Generics は「最新の」方法であり、Data.Data は廃止され、後方互換性のために保持されているだけですか?
2902 次
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)
そして、次の署名で特定のtoJSON
fromを使用します。Data.Aeson.Generic
toJSON :: Data a => a -> Value
于 2013-07-06T13:28:23.003 に答える