以下如何foo :: MonadIO m => m ()foo = print "hi"导致以下错误 无法将类型“ m”与“ IO”匹配 “ m”是由 类型签名: foo :: forall(m :: *-> *)。 MonadIO m => m() 在foo.hs:57:8 预期类型:m() 实际类型:IO()据我所知,由于IO()应该等于MonadIO,所以MonadIO约束不应该允许它起作用吗? 最佳答案 IO不等于MonadIO。简而言之,MonadIO是一个类型类,表示有问题的monad可以执行IO操作。实际上,由于IO monad是“魔术”,所以这仅意味着以下两种情况之一:所讨论的monad本身是IO本身,或者所讨论的monad以某种方式包装IO。为了表达这种包装的想法,MonadIO类型类具有方法liftIO :: IO a -> m a,该方法使您可以执行IO操作并将其“提升”(或者,如果愿意,可以“包装”)到monad ,无论是什么。因此,要修复您的代码,只需要m即可:foo :: MonadIO m => m ()foo = liftIO $ print "hi"
10-06 10:30