首页 > 解决方案 > 如何为具有依赖映射的类型派生 JSON 实例?

问题描述

dependent-map用来创建 GADT 值的映射。我的目标是为它们派生 JSON 实例。该aeson-gadt-th库可以为 GADT 本身(以下P类型)派生 JSON 实例;DMap P Identity但是,由于缺少Generic此类型的实例,自动推导 GADT 值(以下类型)的映射失败: • No instance for (Generic (DMap P Identity)).

我如何Generic为这种类型生成?

import Data.Dependent.Map

data P a where
  P_Title :: P Text

deriveGEq ''P
deriveGCompare ''P
deriveJSONGADT ''P

deriving instance ToJSON (DMap P Identity)

编辑:dependent-sum-aeson-orphans根据 Cale 的回答使用库后:

import Data.Dependent.Sum.Orphans ()

data MyType = MyType (DMap P Identity)
  deriving Generic

deriving instance ToJSON MyType

我看到一个不同的错误:

• Could not deduce: Data.Constraint.Extras.ConstraintsFor'
                      P ToJSON Identity

如果DMap P Identity已经有 JSON 实例(根据孤儿导入),为什么简单类型包装器没有?


编辑 2:好的,在对引用库的代码和示例进行了一些探索之后,我意识到我需要派生ArgDict,之后一切正常!

import Data.Constraint.Extras.TH

deriveArgDict ''P

标签: jsonhaskellgadt

解决方案


这里有一个库,其中包含用于 DSum 和 DMap 的 ToJSON 和 FromJSON 实例。

https://github.com/obsidiansystems/dependent-sum-aeson-orphans

一定要看看它们是如何工作的,这是一个很好的例子,说明可以用constraints-extras做什么。


推荐阅读