【发布时间】:2012-04-26 18:41:59
【问题描述】:
我看到的ToJSON 和FromJSON 的每个示例都是针对具有单个构造函数的数据类型,如下所示:
data RewindConfig = RConfig JobID Phase
deriving Show
instance FromJSON RewindConfig where
parseJSON (Object o) = RConfig
<$> o .: "JobID"
<*> o .: "Phase"
parseJSON _ = fail "invalid RewindConfig"
我想我会看看 Aeson 如何为具有多个构造函数的类型创建实例,例如Either:
instance (FromJSON a, FromJSON b) => FromJSON (Either a b) where
parseJSON (Object (H.toList -> [(key, value)]))
| key == left = Left <$> parseJSON value
| key == right = Right <$> parseJSON value
parseJSON _ = fail ""
parseJSON 中的模式匹配让我很困惑,我不明白 (H.toList -> [(key, value)]) 是怎么回事。
我要为其创建实例的数据类型如下所示:
data Foo = Bar String
| Baz String
| Bin String
我确实想到了做一些我知道如何实施的事情
data Foo = (Maybe Bar) (Maybe Baz) (Maybe Bin)
但这似乎并不令人满意。有人可以通过解释 Either 实例的情况来帮助我吗?也许可以给我一些关于 Foo 的 To/From 实例的指导?
更新:我认为 Aeson 为 Maybe 实现的实例更加清晰,并告诉我我需要知道什么来满足我的需求。不过,我想知道Either 发生了什么。
【问题讨论】:
标签: haskell