Haskell ADTs与aeson

sto*_*ont 4 haskell aeson

我一直在用一个简单的ADT进行战斗,试图让它来回往返JSON,但我没有运气,无论我如何尝试按摩或修改类型.我错过了什么?

编译时,我总是得到相同的运行时错误:

> let t = Fahrenheit
> fromJSON $ toJSON t
Error "when expecting a (), encountered Object instead"
Run Code Online (Sandbox Code Playgroud)

尝试这个只是给了我"没什么",大概是因为同样的错误:解码$ encode t

我试图按照这些来源,但我似乎无法解决 这个运行时错误,无论我尝试什么: Haskell :: Aeson ::基于字段值解析ADT https://www.fpcomplete.com/用户/ Geraldus /代数-数据-类型,ADTS与-埃宋

这是我正在使用的代码的一种形式.起初,我试图将此作为嵌入在另一种类型中的类型,但是当这不起作用时,我添加了"值"键以尝试使这更容易解析(没有运气).

data TemperatureType = Celsius
                     | Fahrenheit
                     deriving (Show,Read,Typeable,Data,Eq)

-- This doesn't work either
-- $(deriveJSON defaultOptions ''TemperatureType)

instance ToJSON TemperatureType where
   toJSON Fahrenheit = object [ "value" .= String "Fahrenheit" ]
   toJSON Celsius    = object [ "value" .= String "Celsius" ]

instance FromJSON TemperatureType where
    parseJSON (Object x) = toTemperatureType <$> x .: "value"

toTemperatureType :: Text -> TemperatureType
toTemperatureType "Fahrenheit" = Fahrenheit
toTemperatureType "Celsius"    = Celsius
Run Code Online (Sandbox Code Playgroud)

zer*_*kms 9

Haskell需要您提供有关表达式结果类型的帮助,因为在当前调用中无法推断它:

> fromJSON $ toJSON t :: Result TemperatureType
Run Code Online (Sandbox Code Playgroud)