Мотивация
У меня есть тип, MyType
, который параметризуется функтором, f
.
Я хочу использовать MyType Identity
для представления "моего взгляда" наданные и MyType Maybe
для представления типа обновлений к данным.
Задача
Можно ли написать экземпляр aeson ToJSON
для MyType
?Я пытался использовать класс ToJSON
, но я получаю сообщение об ошибке (см. Нижнюю часть поста).
{-# LANGUAGE DeriveGeneric #-}
module Main where
import GHC.Generics
import Data.Aeson
data MyType f = MyType
{ age :: f Int
, name :: f String
} deriving(Generic)
instance ToJSON1 f => ToJSON (MyType f)
main :: IO ()
main = print . encode $ MyType (Just 1) (Just "hi")
Как я могу получить экземпляр ToJSON для MyType f
, для произвольного f
?
Ошибка компиляции
Main.hs:12:10: error:
• Could not deduce (ToJSON (f String))
arising from a use of ‘aeson-1.2.4.0:Data.Aeson.Types.ToJSON.$dmtoJSON’
from the context: ToJSON1 f
bound by the instance declaration
at Main.hs:12:10-39
• In the expression:
aeson-1.2.4.0:Data.Aeson.Types.ToJSON.$dmtoJSON @MyType f
In an equation for ‘toJSON’:
toJSON = aeson-1.2.4.0:Data.Aeson.Types.ToJSON.$dmtoJSON @MyType f
In the instance declaration for ‘ToJSON (MyType f)’
|
12 | instance ToJSON1 f => ToJSON (MyType f)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Failed, no modules loaded.