繁体   English   中英

无法将预期的类型“ IO()”与实际类型“ a0-> m0 a0”匹配

[英]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 () 因此,您需要包装的东西是()类型,它只有一个元素,即'()'类型。

更改returnreturn ()并看看是否能工程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM