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

时间:2019-03-29 11:54:42

标签: haskell

我使用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)

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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