我见过ToJSON
每个实例和FromJSON
两种数据类型与单个构造函数,像这样:如何为具有多个构造函数的数据类型编写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"
我以为我会看埃宋是如何使与多个构造类型的实例,例如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
的收件人/发件人实例提供一些指导?
更新:我认为实例Aeson实现的Maybe
更清晰,并告诉我需要知道我的需求。不过,我想知道Either
是怎么回事。
谢谢!我很欣赏从这篇旧文章中学到新东西 – 2014-09-04 23:03:30