0

我有以下 ADT 实现:

data FeatureValue =
    FvInt Int
  | FvFloat Float
  | FvText Text
  | FvBool Bool
  deriving Show

data ApiResponse =
    Online [[Maybe FeatureValue]]
  | Offline [[[Maybe FeatureValue]]]
  deriving Show

要编码的示例值可能是:

example :: ApiResponse
example =
    Online [
        [Just (FvInt 10), Nothing, Just (FvText "foo"), Just (FvFloat 1.42)],
        [Nothing, Just (FvBool False), Just (FvText "bar"), Nothing]
    ]

这将导致以下 JSON:

[
    [10, null, "foo", 1.42],
    [null, false, "bar", null]
]

我特别在如何推导出ToJSON实例上苦苦挣扎FeatureValue。使用 Aeson 进行 ADT 编码的文档特别少(例如,其他很棒的 Aelve 指南,其中包含关于 ADT 编码/解码部分的光荣“摘要:TODO”)。

4

1 回答 1

6

文档中,我们只需要提供一个类型的函数FeatureValue -> Value。的定义Value也被记录并完全导出。所以只要跟着你的鼻子走。

instance ToJSON FeatureValue where
    toJSON (FvInt n) = Number (fromIntegral n)
    toJSON (FvFloat f) = Number (realToFrac f)
    toJSON (FvText t) = String t
    toJSON (FvBool b) = Bool b
于 2021-04-27T15:50:39.507 回答