У меня есть структура данных, которую я создал с помощью GADT, и я хочу проанализировать некоторый json для этого GADT, используя aeson
. Но средство проверки типов жалуется, что во всех случаях возможно создать только один из конструкторов GADT. См. Этот пример:
data Foo = Hello | World
data SFoo :: Foo -> Type where
SHello :: SFoo 'Hello
SWorld :: SFoo 'World
instance FromJSON (SFoo a) where
parseJSON = withText "Foo" \case
"hello" -> pure SHello
"world" -> pure SWorld
Итак, я хочу иметь возможность разобрать строку приветствия на SHello
и строку мира на SWorld
. Средство проверки типов выдает следующую ошибку:
• Couldn't match type ‘'World’ with ‘'Hello’
Expected type: Parser (SFoo 'Hello)
Actual type: Parser (SFoo 'World)
• In the expression: pure SWorld
In a case alternative: "world" -> pure SWorld
In the second argument of ‘withText’, namely
‘\case
"hello" -> pure SHello
"world" -> pure SWorld’
Как я могу разобрать некоторый json на такую структуру GADT?