代理,类型级别符号和JSON

时间:2014-03-11 07:51:48

标签: haskell types proxy vinyl

我正在尝试将自动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)

更多背景http://lpaste.net/101005

如果我用sym替换"name"的所有实例,它就可以运行,并且运行起来非常棒。现在,我可以使用模板Haskell提前生成所有实例,因为我有一个我将实际使用的字段名称的封闭列表,但这似乎是一种耻辱。我对Data.Proxy几乎一无所知,刚刚看到用于为Data.Proxy的记录定义show实例。

1 个答案:

答案 0 :(得分:4)

您只需启用ScopedTypeVariables