Aeson предоставляет FromJSON1
и Классы типов ToJSON1
. Они аналогичны Eq1
и Show1
классы, определенные в Data.Functor.Classes
< /а> модуль.
Мое понимание классов Eq1
и Show1
заключается в том, что они необходимы, чтобы иметь возможность выражать ограничения на аргументы преобразователей без использования расширений, таких как FlexibleContexts
и UndecidableInstances
.
Пример из документации модуля Data.Functor.Classes
выглядит следующим образом:
Предположим, у нас есть тип данных, который действует как преобразователь: T
. Например, пусть он будет изоморфен IdentityT
:
data T f a = T (f a)
Вид T
следующий:
T :: (* -> *) -> * -> *
Если есть экземпляр Eq1
для f
, его можно использовать при записи экземпляра Eq1
для T f
:
instance Eq1 f => Eq1 (T f) where
liftEq :: (a -> b -> Bool) -> T f a -> T f b -> Bool
liftEq eq (T fa1) (T fa2) = liftEq eq fa1 fa2
Если у нас есть экземпляр Eq1
для f
, экземпляр Eq
для a
и экземпляр Eq1
для T f
выше находится в области видимости, мы можем легко написать экземпляр Eq
для T f a
:
instance (Eq1 f, Eq a) => Eq (T f a) where
(==) :: T f a -> T f a -> Bool
(==) = eq1
Тип eq1
определяется следующим образом:
eq1 :: (Eq1 h, Eq a) => h a -> h a -> Bool
В приведенном выше примере h
становится T f
, поэтому тип eq1
можно представить следующим образом:
eq1 :: Eq a => T f a -> T f a -> Bool
Теперь классы Eq1
, Show1
и т. д. имеют смысл. Кажется, что проще писать экземпляры Eq
, Show
и т. д. для трансформаторов.
Однако мне интересно, какие типы FromJSON1
и ToJSON1
используются в Aeson? У меня редко бывают преобразователи, которые я хочу использовать в JSON и обратно.
Большинство типов данных, которые я в конечном итоге заменяю на JSON, являются обычными типами (а не конструкторами типов). То есть типы с видом *
. Я также использую типы вроде Maybe
с типом * -> *
.
Однако я не думаю, что часто создаю экземпляры ToJSON
или FromJSON
для трансформеров, как T
выше. Что такое преобразователь, который часто используется для перехода к JSON и обратно? Я пропускаю некоторые полезные трансформеры?