Haskell 不能';t将预期类型[a0]与实际类型IO()匹配

Haskell 不能';t将预期类型[a0]与实际类型IO()匹配,haskell,syntax,Haskell,Syntax,我的代码中有什么错误: insertValue file x = if x == "10" then "ok" else do putStrLn "Error"; file “ok”的类型为“String”,而“else”子句的类型为“IO()”。在Haskell中,“if”是一个表达式,因此它们必须匹配 在不知道您要做什么的情况下很难提供更多帮助。在if..then..else表达式中,两个分支必须具有相同的类型 其中一个分支是: "10" :: String do pu

我的代码中有什么错误:

insertValue file x = 
    if x == "10" then "ok"
    else do putStrLn "Error"; file
“ok”的类型为“String”,而“else”子句的类型为“IO()”。在Haskell中,“if”是一个表达式,因此它们必须匹配


在不知道您要做什么的情况下很难提供更多帮助。

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

其中一个分支是:

"10" :: String
do putStrLn "Error"; file :: IO ??
另一个分支是:

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

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

您需要使用
return::a->IO a
将字符串“提升”到
IO String

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

但是您确定不想调用
putStrLn“ok”
(而不是
返回“ok”
)并返回一个值吗?否则,您将返回
文件
“ok”
,并且您的调用者无法确定在对名为“ok”的文件调用
insertValue
时是否存在错误。

例如,insertValue“99”“10”应返回“ok”。insertValue“99”“5”应打印“Error”并返回“99”。@newuser:在Haskell中,您不能只执行一些IO(或monad中的任何其他内容),然后继续执行,就好像您只执行了一些纯计算一样。一旦函数接触到
IO
,它就被“污染”,并且必须同时返回
IO
值。@newuser:可以。使用
return
将纯值转换为IO污染值。e、 g.
返回“ok”
返回文件