无法匹配预期的类型

new*_*ser 2 haskell

我想做一些不同的事情,但它会太长,所以下面只是一个例子:

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)

Nei*_*own 6

你需要让双方都有相同的类型,即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分支中的块也是如此.