无法将预期的FullWeather类型与实际类型m1 FullWeather相匹配

时间:2018-06-29 17:16:40

标签: json haskell haskell-stack

我正在使用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

1 个答案:

答案 0 :(得分:2)

我可以发现三个问题:

  1. do表示单值,并且是(>>=)(>>)应用程序的语法糖。不要对不返回单值的函数使用do表示法(例如IO a[a]Maybe a ...)。正确的语法是let ... in ...
    我建议遵循类似Learn you a Haskell的Haskell教程,该教程将教您正确使用do-notation。

  2. 函数return的类型为return :: Monad m => a -> m a
    return不是关键字

  3. 如果您的函数返回FullWeather,则它也不能返回字符串。这就是EitherMaybe的用途。
    您可以做的另一件事是引发错误。

我们可以使用3种基本解决方案:

  1. 在出现问题的情况下引发错误。

    extractValues :: BSL.ByteString -> FullWeather
    extractValues rawJSON =
        let result  = eitherDecode rawJSON :: Either String FullWeather
        in case result of
            Left problem -> error problem
            Right ok     -> ok
    
  2. 返回一个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
    
  3. 返回一个Either String FullWeather而不是FullWeather

    extractValues :: BSL.ByteString -> Either String FullWeather
    extractValues = eitherDecode