我見過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