Прокси, символы уровня типа и JSON

Я пытаюсь добавить автоматический анализ 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, только что видел в используется для определения экземпляра show для записей Data.Proxy.

1 ответ

Решение

Вы просто должны включить ScopedTypeVariables,

Другие вопросы по тегам