Reputation: 11963
There are currently 2 (3 if you count TemplateHaskell) options for generic programming using GHC, Data.Data / Data.Typeable and GHC.Generics, both available from the base package. So, what are the advantages and disadvantages of each? Is GHC.Generics the "modern" way and Data.Data obsolete and just kept for backwards compatibility?
Upvotes: 35
Views: 3149
Reputation: 43309
GHC.Generics is the modern way and it is much faster than SYB. It however exposes a different approach to generic programming to the end user, so I don't think that it should be thought of as a direct replacement of SYB, though it does solve the same problems.
A good example of how those approaches differ from user's perspective can be extracted from the aeson library's functionality of serialization of a record to 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]
And use toJSON
of ToJSON
typeclass afterwards.
{-# LANGUAGE DeriveGeneric #-}
import Data.Aeson
import GHC.Generics
data Coord = Coord { x :: Double, y :: Double } deriving Generic
instance ToJSON Coord
And use the same toJSON
of ToJSON
typeclass afterwards.
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Aeson.Generic
data Coord = Coord { x :: Double, y :: Double } deriving (Data, Typeable)
And use a specific toJSON
from Data.Aeson.Generic
with the following signature:
toJSON :: Data a => a -> Value
Upvotes: 27