gpt4 book ai didi

haskell - Aeson 中的单标签构造函数

转载 作者:行者123 更新时间:2023-12-04 16:42:25 31 4
gpt4 key购买 nike

我有这样的数据类型:

data A = A T.Text deriving (Generic, Show)

instance A.ToJSON A

如果我对它使用A.encode:

A.encode $ A "foobar" -- "foobar"

然后我在上面使用singleTagConstructors:

instance A.ToJSON A where
toEncoding a = A.genericToEncoding $ A.defaultOptions { A.tagSingleConstructors = True }

A.encode $ A "foobarquux" -- "{tag: A, contents: foobarquux}"

在某些时候我制作了另一种数据类型:

newtype Wrapper a = Wrapper 
{ unWrap :: a
} deriving (Show)

instance A.ToJSON a => A.ToJSON (Wrapper a) where
toJSON w = A.object [ "wrapped" A..= unWrap w ]

这是我感到困惑的部分:

A.encode $ Wrapper $ A "foobar" -- "{wrapped: foobar}"

如何得到这样的结果?

"{wrapped: {tag: A, contents: foobarquux}}"

最佳答案

要直接回答问题,您始终可以使用 tagSingleConstructors = False 实现 Wrapper 实例,如下所示:

instance Generic a => A.ToJSON (Wrapper a) where 
toJSON w = A.object [ "wrapped" A..= encA (unWrap w) ]
where
encA = A.genericToEncoding $ A.defaultOptions { A.tagSingleConstructors = False }

但我不明白你为什么要那样做。

如果您控制 API,则不需要 tag 字段:包装值的预期类型已经静态已知,因此 tag 不会是有帮助。

如果您不控制 API,我建议非常明确地表示它,例如作为与 API 形状完全匹配的记录。否则,您可能会因在代码库的远程部分进行不相关的更改而意外破坏 API。

关于haskell - Aeson 中的单标签构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57628831/

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