Используя мою идею в комментарии эксплуатируя {- # LANGUAGE DeriveGeneric, FlexibleContexts, MultiParamTypeClasses, ScopedTypeVariables, TypeApplications, UndecidableInstances # -} модуль Main , где импорт GHC.Generics импорт Data.Aeson импорт Data.Constraint импорт Data.Constraint.Lifting данных MyType е = MyType { возраст :: е Int , имя :: е строки } вывод ( Generic ) экземпляр ( Подъем ToJSON f ) => ToJSON ( MyType f ), где toJSON mt | Sub Dict <- подъем @ ToJSON @ F @ Int , Sub Dict <- подъем @ ToJSON @ F @ Строка = genericToJSON defaultOptions мт например Подъемное ToJSON Может быть , где подъемная = Sub Dict главная :: IO () основной = печать . encode $ MyType ( Just 1 ) ( Just "hi" ) .html "rel =" nofollow noreferrer "> Dict
class, и после некоторого вмешательства я пришел к этому
ToJSON Int
Заметки:
Dict
преобразует назад и вперед между ограничениями (такими какlifting @ToJSON @f @Int
) и значениями.genericToJSON defaultOptions
является просто конструктором для вложения ограничений.toJSON
это синтаксис приложения типа .- Я использовал
lifting
, просматривая реализацию по умолчаниюtoJSON
.lifting
Сначала нам нужно было вручную перенести некоторые экземпляры в область видимости .
Надеюсь, это поможет.