haskell - 代理、类型级别符号和 JSON

标签 haskell types proxy vinyl

我正在尝试向 Data.Vinyl 添加自动 json 解析

这是一个 FromJSON 实例,用于仅包含一个元素的记录。

它几乎可以工作,但我无法满足 KnownSymbol 约束,它似乎会在我身上自动生成一个新的类型变量。

instance (KnownSymbol sym, FromJSON a) => FromJSON (PlainRec '[ sym ::: a ]) where
    parseJSON (Object v) = (field =:) <$> (v .: json_name)
        where field = Field :: (sym ::: a)
              json_name = T.pack $ show field

错误是

Could not deduce (KnownSymbol sym0) arising from a use of ‛show’
from the context (KnownSymbol sym, FromJSON a)

更多上下文http://lpaste.net/101005

如果我用 "name" 替换 sym 的所有实例,它就可以工作,并且可以运行,而且非常棒。现在,我可以使用模板 Haskell 提前生成所有实例,因为我有一个实际使用的字段名称的封闭列表,但这似乎很遗憾。我对 Data.Proxy 几乎一无所知,刚刚看到用于定义 Data.Proxy 记录的显示实例。

最佳答案

您只需启用ScopedTypeVariables

关于haskell - 代理、类型级别符号和 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22319457/

相关文章:

c++ - 顺序异构函数执行器

list - 查找列表和谓词的任何可能的键合

haskell - 如何理解将 (.) 运算符用作参数的表达式?

performance - Haskell/GHC 内存了多少?

haskell - 爆炸符号在数据类型中的作用是什么?

c++ - 将类型作为函数的参数 C++

python - Union 赋值中的不兼容类型

eclipse - eclipse 中的空白 "active provider"

python - 使用远程机器(类似于代理)通过 JupyterLab 打开网站

linux - 带有 .pac 文件的 Ubuntu apt-get