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”
和返回文件
。