我正在尝试将自动json解析添加到Data.Vinyl
以下是FromJSON的实例,只包含一个元素的记录。
它几乎可以工作,但我无法满足KnownSymbol约束,它似乎会自动生成一个新的类型变量。
instance (KnownSymbol sym, FromJSON a) => FromJSON (PlainRec '[ sym ::: a ]) where
parseJSON (Object v) = (field =:) <$> (v .: json_name)
where field = Field :: (sym ::: a)
json_name = T.pack $ show field
错误是
Could not deduce (KnownSymbol sym0) arising from a use of ‛show’
from the context (KnownSymbol sym, FromJSON a)
如果我用sym
替换"name"
的所有实例,它就可以运行,并且运行起来非常棒。现在,我可以使用模板Haskell提前生成所有实例,因为我有一个我将实际使用的字段名称的封闭列表,但这似乎是一种耻辱。我对Data.Proxy几乎一无所知,刚刚看到用于为Data.Proxy的记录定义show实例。
答案 0 :(得分:4)
您只需启用ScopedTypeVariables
。