私が見たすべての例は、次のように、単一のコンストラクターを持つデータ型を対象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
インスタンスで何が起こっているのかを説明し、おそらくTo / Fromインスタンスに関するガイダンスを教えてくれますFoo
か?
更新:Aesonが実装するインスタンスMaybe
ははるかに明確であり、自分のニーズのために何を知る必要があるかを教えてくれると思います。それでも、で何が起こっているのか知りたいEither
です。