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