Я хочу проанализировать внешний json, где RequestItem
и FolderItem
могут отображаться в одном и том же месте.Я пришел со следующей кодировкой, где каждый вариант определен как отдельный тип данных:
data RequestItem = RequestItem { name :: String } deriving (Generic, Show)
data FolderItem = FolderItem { item :: [Item] } deriving (Generic, Show)
data Item
= RequestChoice RequestItem
| FolderChoice FolderItem
deriving (Show)
instance FromJSON Item where
parseJSON = (\v -> asum [
RequestChoice <$> (genericParseJSON defaultOptions v),
FolderChoice <$> (genericParseJSON defaultOptions v)
]) :: Value -> Parser Item
Можно ли это упростить до определения одного типа данных, исключив RequestChoice
и FolderChoice
?
Одно ограничение: я не хочу писать парсер вручную, а использую обобщенный вывод.