[英]Couldn't match expected type `IO ()' with actual type `a0 -> m0 a0'
这是我的代码:
doSomething :: IO Bool -> IO () -> IO ()
doSomething cond body = cond >>= ( \condition -> if condition then return else body )
它给了我这个错误:
Couldn't match expected type `IO ()' with actual type `a0 -> m0 a0'
In the expression: return
In the expression: if condition then return else body
In the second argument of `(>>=)', namely
`(\ condition -> if condition then return else body)'
我也尝试过这种等效表示法:
whileM :: IO Bool -> IO () -> IO ()
whileM cond body = do
condition <- cond
if condition then return else body
但我或多或少都得到了相同的表示法。 我知道错误是指函数希望我返回Monad,但我返回的是将a0
转换为monad m a0
的函数。 我怎样才能解决这个问题?
与其他语言(几乎所有其他语言)不同,在Haskell中, return
并不意味着“终止此代码并返回到称为它的下一行”。
在Haskell中,(大致)表示“将其包装成monad”。 在do
表示法的上下文中,这通常发生在代码中将控制权交还给“调用者”的位置(再次,这实际上不是正确的词,但是以此类推)。
因此, return
在这里需要一个参数(要包装的东西)。... return
的类型为Monad m => a -> ma
,但是您的函数返回的类型为IO ()
。 因此,您需要包装的东西是()
类型,它只有一个元素,即'()'类型。
更改return
到return ()
并看看是否能工程。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.