Используя мою идею в комментарии эксплуатируя {- # 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Сначала нам нужно было вручную перенести некоторые экземпляры в область видимости .
Надеюсь, это поможет.