首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多态类型的aeson实例

多态类型的aeson实例
EN

Stack Overflow用户
提问于 2020-04-15 16:52:59
回答 1查看 184关注 0票数 0

如何为多态类型手工编写aeson实例,如:

代码语言:javascript
复制
data Show a => Translatable a = Translatable (Map.Map String a)
    deriving (Show, Eq, Typeable)

我想编码一个

代码语言:javascript
复制
Translatable $ Map.fromList [("key", "value"), ("key2", "value2")]

到像{ "key", "value", "key2", "value2" }这样的json对象

到目前为止,我尝试的是:

代码语言:javascript
复制
import qualified Data.Aeson as A
import Data.Data (Typeable)
import qualified Data.Map as Map

data Show a => Translatable a = Translatable (Map.Map String a)
    deriving (Show, Eq, Typeable)

instance Show a => A.ToJSON (Translatable a) where
    toEncoding xs = A.object $ map (.=) (Map.toList xs)

错误

代码语言:javascript
复制
 Couldn't match type ‘A.Value’
 with ‘Data.Aeson.Encoding.Internal.Encoding' A.Value’
      Expected type: A.Encoding
        Actual type: A.Value

伊索文档展示:type Encoding = Encoding' Value

但是A.Encoding‘不在范围之内

代码语言:javascript
复制
Not in scope: data constructor ‘A.Encoding'’

我做错什么了?

编辑:

我把我的翻译变成了一种类型

代码语言:javascript
复制
type Translatable a = Map.Map String a

现在,它可以工作,而无需将可翻译的实例添加到ToJSON中。

但最初的问题仍然是问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-15 22:03:30

您正在将toJSONtoEncoding函数混合起来。只需实现toJSON实例的ToJSON函数即可。我引进了不合格的Data.Aeson,以减少与运营商的斗争。

代码语言:javascript
复制
import Data.Aeson
import qualified Data.Text as T

--- etc.

instance Show a => ToJSON (Translatable a) where
    toJSON (Translatable myMap) = toJSON
        [ object [ T.pack key .= show val ] | (key, val) <- Map.toList myMap ]

我们使用json对象列表上的toJSON函数来创建json数组。T.pack key是必需的,因为您的地图键是String的,但是.=需要Text

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61234262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档