4

我一直在与一个简单的 ADT 作斗争,试图让它来回往返于 JSON,但无论我如何尝试按摩或修改类型,我都没有运气。我错过了什么?

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

> let t = Fahrenheit
> fromJSON $ toJSON t
Error "when expecting a (), encountered Object instead"

尝试这个只会给我“什么都没有”,大概是因为同样的错误:decode $ encode t

我试图遵循这些来源,但无论我尝试什么,我似乎都无法解决这个运行时错误: Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/用户/Geraldus/代数数据类型-adts-with-aeson

这是我正在使用的一种形式的代码。起初,我尝试将其用作嵌入在另一种类型中的类型,但当这不起作用时,我添加了“值”键以尝试使解析更容易(不走运)。

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
4

1 回答 1

9

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

> fromJSON $ toJSON t :: Result TemperatureType
于 2015-01-26T01:13:34.317 回答