我的代码出了什么问题:
insertValue file x =
if x == "10" then "ok"
else do putStrLn "Error"; file
答案 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”是一个表达式,所以它们必须匹配。
在不知道你想要做什么的情况下很难提供帮助。