我使用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
答案 0 :(得分:1)
这里有一个库,其中包含DSum和DMap的ToJSON和FromJSON实例。
https://github.com/obsidiansystems/dependent-sum-aeson-orphans
一定要看看它们是如何工作的,这是constraints-extras可以做的一个很好的例子。