我想做一些不同的事情,但它会太长,所以下面只是一个例子:
test x y = if x == "5" then x
else do putStrLn "bad value"; y
Run Code Online (Sandbox Code Playgroud)
所以,如果x == 5它应该返回x,否则它应该打印'bad value'并返回y - 我怎样才能在haskell中执行此操作?
编辑:
为什么这段代码会返回错误:"无法将预期类型的bool与实际类型IO bool匹配"?
canTest :: String -> IO Bool
canTest x = if x == "5" then return True
else do putStrLn "bad value"; return False
test x y = if canTest x then x
else y
Run Code Online (Sandbox Code Playgroud)
你需要让双方都有相同的类型,即IO String.为此,您需要使用return将值提升到monad中,即
test :: String -> String -> IO String
test x y = if x == "5"
then return x
else do putStrLn "bad value"
return y
Run Code Online (Sandbox Code Playgroud)
现在return x有了类型IO String,doelse分支中的块也是如此.