gpt4 book ai didi

haskell - 爱生 : generics with default values

转载 作者:行者123 更新时间:2023-12-02 20:36:27 27 4
gpt4 key购买 nike

今天我想解决下一个问题。

假设我们将类型类 DataWithDefault 定义为

class DataWithDefault a where
defaultValue :: a

我们的数据示例定义为

data Example =
Example { field1 :: Text
, field2 :: Text
} deriving (Show)

instance DataWithDefault Example where
defaultValue = Example "Hello" "World"

instance FromJSON Example where
parseJSON (Object v) =
Example <$> v .:? "field1" .!= field1 defaultValue
<*> v .:? "field2" .!= field2 defaultValue
parseJSON _ = mzero

instance ToJSON Example where
toJSON (Example f1 f2) =
object [ "field1" .= f1
, "field2" .= f2
]

我知道 Aeson 使用 Generics 自动派生 FromJSONToJSON 实例,但我不知道如何让它派生 FromJSON > 具有未在给定 json 中表示的字段的默认值的实例。是否可以使用泛型来实现?实际上我不问你最终的解决方案,但也许有一些线索?

更新

让我添加有关该问题的更多信息。

假设现在您需要更新您的Example数据,现在它定义为

data Example =
Example { field1 :: Text
, field2 :: Text
, field3 :: Int
} deriving (Show)

因此您想要更新 DataWithDefault 实例声明

instance DataWithDefault Example where
defaultValue = Example "Hello" "World" 12

而我想做的不是写

instance FromJSON Example where
parseJSON (Object v) =
Example <$> v .:? "field1" .!= field1 defaultValue
<*> v .:? "field2" .!= field2 defaultValue
<*> v .:? "field3" .!= field3 defaultValue
parseJSON _ = mzero

并且想要自动派生这样的实例定义。更重要的是,我不仅想为 Example 执行此操作,还为 DataWithDefault a 执行此操作。

更新2

组合 .:?.!= 的目的是从给定的 json 中获取尽可能多的字段,并将每个缺失的字段设置为其默认值。所以当我们通过

{ "field1" : "space", "field2" : "ship" }

我希望我的新示例不是 field1 = Hello;字段2=世界; field3 = 12,但 field1 = 空格;字段2 = 船;字段3 = 12

最佳答案

不要让 Aeson 这样做,只需使用新类型来实现其设计目的:

newtype DefaultJSON a = DefaultJSON { unDefaultJSON :: a }

instance (FromJSON a, DataWithDefault a) => FromJSON (DefaultJSON a) where
parseJSON v = DefaultJSON <$> (parseJSON v <|> pure defaultValue)

然后你就可以了

> decode "{}" :: Maybe (DefaultJSON Example)
Just (DefaultJSON {unDefaultJSON = (Example {field1 = "Hello", field2 = "World"}})

这与您要求的有点不同,它提供了一个默认值以防解析失败,但不是每个字段的默认值以防单个字段丢失。

关于haskell - 爱生 : generics with default values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683693/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com