Подтвердить что ты не робот

GHC.Generics или Data.Data?

В настоящее время существует 2 (3, если вы считаете TemplateHaskell) опции для общего программирования с использованием GHC, Data.Data/Данные .Typeable и GHC.Generics, оба доступны из базового пакета. Итак, каковы преимущества и недостатки каждого? Является ли GHC.Generics "современным" способом и Data.Data устаревшим и просто поддерживается для обратной совместимости?

4b9b3361

Ответ 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