GHC.Generics or Data.Data?

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:

Without generics

{-# 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.

Using GHC.Generics

{-# 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.

Using SYB

{-# 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

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)