Не удалось сопоставить ожидаемый тип FullWeather с фактическим типом m1 FullWeather - PullRequest
0 голосов
/ 29 июня 2018

Я работаю с кодом JSON. И я не могу извлечь из него значение из-за ошибки в типе. И чтобы получить эту ошибку, я использую функцию либо Dedecode

Кодовая часть:

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 голосов
/ 29 июня 2018

Три проблемы, которые я могу заметить:

  1. do-нотация предназначена для монадических значений и является синтаксическим сахаром для приложений (>>=) и (>>). Не используйте do-обозначения для функций, которые не возвращают монадическое значение (например, IO a, [a], Maybe a ...). За пределами нотации правильный синтаксис: let ... in ....
    Я предлагаю следовать руководству по Haskell, например Learn the Haskell , которое научит вас правильному использованию do-обозначений.

  2. Функция return имеет тип return :: Monad m => a -> m a.
    return не является ключевым словом .

  3. Если ваша функция возвращает FullWeather, она также не может вернуть строку. Вот для чего Either или Maybe.
    Другая вещь, которую вы можете сделать, это выдать ошибку.

Для этого можно использовать 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
    
...