Haskell 与 aeson 的 ADT
Haskell ADTs with aeson
我一直在与一个简单的 ADT 作斗争,试图让它来回往返于 JSON,但我没有运气,无论我如何尝试按摩或修改类型。我错过了什么?
编译时,我总是得到相同的运行时错误:
> let t = Fahrenheit
> fromJSON $ toJSON t
Error "when expecting a (), encountered Object instead"
尝试这个只会给我 "Nothing",大概是因为同样的错误:decode $ encode t
我已尝试遵循这些来源,但无论我尝试什么,我似乎都无法解决此运行时错误:
Haskell :: Aeson :: parse ADT based on field value
https://www.fpcomplete.com/user/Geraldus/algebraic-data-types-adts-with-aeson
这是我正在使用的一种代码形式。起初,我尝试将其用作嵌入到另一种类型中的类型,但当这不起作用时,我添加了 "value" 键以尝试更轻松地解析它(运气不好)。
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
Haskell 需要您帮助了解表达式结果的类型,因为在当前调用中无法推断它:
> fromJSON $ toJSON t :: Result TemperatureType
我一直在与一个简单的 ADT 作斗争,试图让它来回往返于 JSON,但我没有运气,无论我如何尝试按摩或修改类型。我错过了什么?
编译时,我总是得到相同的运行时错误:
> let t = Fahrenheit
> fromJSON $ toJSON t
Error "when expecting a (), encountered Object instead"
尝试这个只会给我 "Nothing",大概是因为同样的错误:decode $ encode t
我已尝试遵循这些来源,但无论我尝试什么,我似乎都无法解决此运行时错误: Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/user/Geraldus/algebraic-data-types-adts-with-aeson
这是我正在使用的一种代码形式。起初,我尝试将其用作嵌入到另一种类型中的类型,但当这不起作用时,我添加了 "value" 键以尝试更轻松地解析它(运气不好)。
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
Haskell 需要您帮助了解表达式结果的类型,因为在当前调用中无法推断它:
> fromJSON $ toJSON t :: Result TemperatureType