我目前正在包装一个 Rest(ish) API。JSON 看起来像这样,但更广泛:
{ 'a' : 'Bar1 Bar1B' }
{ 'a' : 'Bar2 Bar2A' }
这似乎可以用 Enum 类型很好地表示。例如:
data Foo = Foo { a :: Bar }
data Bar = Bar1 Bar1 | Bar2 Bar2
data Bar1 = Bar1A | Bar1B
data Bar2 = Bar2A | Bar2B
我有两个问题。
虽然我可以很容易地编写 ToJSON 实例:
instance ToJSON Bar1 where
ToJSON Bar1A = String "Bar1A"
ToJSON Bar1B = String "Bar1B"
当我编写相应的 FromJSON 实例时,它们无法解码:
instance FromJSON Bar1 where
parseJSON (String "Bar1A") = return Bar1A
parseJSON (String "Bar1B") = return Bar1B
parseJSON _ = mzero
为什么是这样?
其次,这似乎需要我编写大量的样板文件。有没有办法解决?例如,使用 Show/Read 或模板 haskell?