У меня есть следующий код:
{-# LANGUAGE DeriveGeneric, OverloadedStrings #-}
import Data.Aeson
import GHC.Generics
data CharClass = Fighter | Rogue | Wizard deriving (Generic, Show)
instance FromJSON CharClass
instance ToJSON CharClass
Я могу кодировать значения этого типа:
*Main> encode Fighter
"\"Fighter\""
Но обход не работает:
*Main> eitherDecode $ encode Fighter
Left "Failed reading: satisfy"
*Main> :t eitherDecode $ encode Fighter
eitherDecode $ encode Fighter :: FromJSON a => Either String a
Это очень похоже на ответ на этот вопрос, но добавление ожидаемого типа не работает:
*Main> eitherDecode $ encode Fighter :: Either String CharClass
Left "Failed reading: satisfy"
Интересно, что это работает для fromJSON
/toJSON
:
*Main> fromJSON $ toJSON Fighter :: Result CharClass
Success Fighter
Если сделать хотя бы один из конструкторов ненулевым, то все заработает, например, если я сделаю так:
data CharClass = Fighter Int | Rogue | Wizard deriving (Generic, Show)
А затем снова попробуйте туда-обратно:
*Main> decode $ encode (Fighter 0) :: Maybe CharClass
Just (Fighter 0)
Я уверен, что упустил что-то простое, но попытка отследить это через общий код заставила меня закружиться.
Read
? - person Jeremy List   schedule 17.07.2015Read
не имеет значения, но спасибо за предложение. - person Jack Kelly   schedule 17.07.2015FromJSON
иToJSON
(я всегда реализовывал их вручную, чтобы соответствовать уже существующей схеме) - person Jeremy List   schedule 17.07.2015eitherDecode
с сигнатурой типа, чтобы проверить несоответствия кодирования/декодирования. - person dfeuer   schedule 17.07.2015eitherDecode
и:t
. - person Jack Kelly   schedule 17.07.2015