如何为具有依赖映射的类型派生JSON实例?

问题描述 投票:0回答:1

我使用dependent-map来创建GADT值的地图。我的目标是为它们派生JSON实例。 aeson-gadt-th库可以为GADT本身派生JSON实例(下面的P类型);然而,由于在此类型上缺少DMap P Identity实例,因此自动导出GADT值的地图(下面的Generic类型)失败:• 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
haskell
1个回答
1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.