我正在使用json代码。而且由于类型错误,我无法从中提取值。为了得到此错误,我使用了一个功能要么Decode
代码部分:
extractValues :: BSL.ByteString -> FullWeather
extractValues rawJSON = do
let result = eitherDecode rawJSON :: Either String FullWeather
case result of
Left problem -> return problem
Right ok -> return ok
Eroor:
Couldn't match expected type ‘FullWeather’
with actual type ‘m0 String’
25 Left problem -> return problem
Couldn't match expected type ‘FullWeather’
with actual type ‘m1 FullWeather’
26 Right ok -> return ok
答案 0 :(得分:2)
我可以发现三个问题:
do表示单值,并且是(>>=)
和(>>)
应用程序的语法糖。不要对不返回单值的函数使用do表示法(例如IO a
,[a]
,Maybe a
...)。正确的语法是let ... in ...
。
我建议遵循类似Learn you a Haskell的Haskell教程,该教程将教您正确使用do-notation。
函数return
的类型为return :: Monad m => a -> m a
。
return
不是关键字。
如果您的函数返回FullWeather
,则它也不能返回字符串。这就是Either
或Maybe
的用途。
您可以做的另一件事是引发错误。
我们可以使用3种基本解决方案:
在出现问题的情况下引发错误。
extractValues :: BSL.ByteString -> FullWeather
extractValues rawJSON =
let result = eitherDecode rawJSON :: Either String FullWeather
in case result of
Left problem -> error problem
Right ok -> ok
返回一个Maybe FullWeather
而不是FullWeather
。
extractValues :: BSL.ByteString -> Maybe FullWeather
extractValues rawJSON =
let result = eitherDecode rawJSON :: Either String FullWeather
in case result of
Left problem -> Nothing
Right ok -> Just ok
返回一个Either String FullWeather
而不是FullWeather
。
extractValues :: BSL.ByteString -> Either String FullWeather
extractValues = eitherDecode