无法将预期类型[a0]与实际类型IO()匹配

时间:2011-05-22 09:36:42

标签: haskell syntax

我的代码出了什么问题:

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

3 个答案:

答案 0 :(得分:2)

if..then..else表达式中,两个分支必须具有相同的类型。

一个分支是:

"10" :: String

另一个分支是:

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

由于我不确定你要做什么(编译器也不确定),我不知道如何纠正代码。

答案 1 :(得分:2)

您需要使用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")并返回一个Maybe值吗?否则,您将返回file"ok",并且您的调用方无法确定在名为“ok”的文件上调用insertValue时是否出现错误。

答案 2 :(得分:1)

“ok”的类型为“String”,而“else”子句的类型为“IO()”。在Haskell中,“if”是一个表达式,所以它们必须匹配。

在不知道你想要做什么的情况下很难提供帮助。