首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带aeson的Haskell ADTs

带aeson的Haskell ADTs
EN

Stack Overflow用户
提问于 2015-01-26 00:45:22
回答 1查看 477关注 0票数 4

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

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

代码语言:javascript
复制
> let t = Fahrenheit
> fromJSON $ toJSON t
Error "when expecting a (), encountered Object instead"

尝试这样做只会给我带来“什么”,大概是因为同样的错误:解码$ encode t。

我试图跟踪这些源,但是无论我尝试什么,我似乎都无法避免这个运行时错误:Haskell :: Aeson :: parse ADT based on field value https://www.fpcomplete.com/user/Geraldus/algebraic-data-types-adts-with-aeson

这是我使用的代码的一种形式。起初,我试图将它作为嵌入到另一种类型中的类型使用,但是当这种方法不起作用时,我添加了"value“键,以使解析更容易(运气不好)。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-26 01:13:34

在表达式结果的类型方面,Haskell需要您的帮助,因为在当前调用中,不可能推断它:

代码语言:javascript
复制
> fromJSON $ toJSON t :: Result TemperatureType
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28143342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档