У меня есть несколько типов данных, представляющих состояние приложения. В разных местах в типе данных у меня есть встроенные функции или монадические действия, например.Можно ли в общих чертах удалить типы функций из типа данных, чтобы позволить getiveJSON?
data Foo = Foo Int (ActionM String)
data Bar = Bar Foo (Maybe Bar) (ActionM())
Мне нужно закодировать большинство из этих типов данных, как JSON, так что я могу отправить его в браузер для отображения. Использование deriveJSON (из пакета Aeson) не работает, потому что экземпляры ActionM не могут быть получены. Тем не менее, я фактически не хочу, чтобы эти биты были отправлены в любом случае. В настоящее время у меня есть подход, который работает, но в основном копирует полный набор типов данных и вручную удаляет вложенные поля ActionM.
Мне (думаю, я) нужна одна из двух вещей. Либо
- способ сказать deriveJSON просто игнорировать поля, которые он не может понять, и, возможно, разобрать их обратно в
undefined
. Насколько я могу судить, этого не существует - способ автоматического создания параллельного набора типов данных с удалением этих полей. Поэтому я хочу, чтобы написать что-то вроде
applyMagic Bar
и получить назад
data Foo' = Foo' Int
data Bar' = Bar' Foo' (Maybe Bar')
Является ли все это возможно, и как бы я это сделать?
Если 'ActionM' - это' data' или 'newtype', вы можете просто определить экземпляр« ToJSON »для него, который кодирует его как некоторое простое значение JSON (например, 0 или« ».) Затем вы можете автоматически вывести ToJSON для 'Foo'. Он все еще содержит дополнительную простоту, но это сэкономит вам много работы. – ErikR