не удалось сопоставить ожидаемый тип [a0] с фактическим типом IO () - PullRequest
4 голосов
/ 22 мая 2011

Что не так в моем коде:

insertValue file x = 
    if x == "10" then "ok"
    else do putStrLn "Error"; file

Ответы [ 3 ]

2 голосов
/ 22 мая 2011

В выражении if..then..else обе ветви должны иметь одинаковый тип.

Одна ветвь:

"10" :: String

Другая ветвь:

do putStrLn "Error"; file :: IO ??

Поскольку я не уверен, что вы пытаетесь сделать (и компилятор тоже не уверен), я не знаю, как исправить код.

2 голосов
/ 22 мая 2011

Вам нужно использовать return :: a -> IO a, чтобы «поднять» ваши строки в IO String:

insertValue file x = 
    if x == "10"
      then return "ok"
      else do putStrLn "Error"
              return file

Но вы уверены, что не хотите звонить putStrLn "ok" (вместо return "ok") и вернуть значение Может быть?В противном случае вы возвращаете file или "ok", и ваш вызывающий никогда не сможет определить, произошла ли ошибка при вызове insertValue в файле с именем "ok".

1 голос
/ 22 мая 2011

«ok» относится к типу «String», а предложение «else» относится к типу «IO ()».В Haskell выражение «если» является выражением, поэтому они должны соответствовать.

Трудно помочь больше, не зная, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...