接下来怎么办
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约束不应该允许它起作用吗?
答案 0 :(得分:10)
IO
不等于MonadIO
。
MonadIO
是一个类型类,简单来说,意味着所讨论的monad可以执行IO操作。实际上,由于IO
monad是“魔术”,所以这仅意味着以下两种情况之一:有问题的monad本身就是IO
或有问题的monad {em>包装 { {1}}。
为了表达这种包装的思想,IO
类型类具有方法MonadIO
,该方法使您可以进行liftIO :: IO a -> m a
操作并“提升”(或者,如果愿意,
IO
中。
因此,要修正您的代码,您只需m
:
liftIO