В настоящее время существует 2 (3, если вы считаете TemplateHaskell) опции для общего программирования с использованием GHC, Data.Data/Данные .Typeable и GHC.Generics, оба доступны из базового пакета. Итак, каковы преимущества и недостатки каждого? Является ли GHC.Generics "современным" способом и Data.Data устаревшим и просто поддерживается для обратной совместимости?
GHC.Generics или Data.Data?
Ответ 1
GHC. Генетика - это современный способ, и он намного быстрее, чем SYB. Однако он предоставляет для конечного пользователя другой подход к универсальному программированию, поэтому я не думаю, что его следует рассматривать как прямую замену SYB, хотя он и решает одни и те же проблемы.
Хороший пример того, как эти подходы отличаются от пользовательской перспективы, можно извлечь из aeson library в функции сериализации записи в 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
typeclass впоследствии.
Использование GHC.Generics
{-# LANGUAGE DeriveGeneric #-}
import Data.Aeson
import GHC.Generics
data Coord = Coord { x :: Double, y :: Double } deriving Generic
instance ToJSON Coord
И затем используйте те же toJSON
toJSON
typeclass.
Использование SYB
{-# LANGUAGE DeriveDataTypeable #-}
import Data.Data
import Data.Aeson.Generic
data Coord = Coord { x :: Double, y :: Double } deriving (Data, Typeable)
И используйте конкретный toJSON
из Data.Aeson.Generic
со следующей подписью:
toJSON :: Data a => a -> Value