即使有类型约束也无法匹配类型错误

时间:2018-12-26 03:49:12

标签: haskell

接下来怎么办

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约束不应该允许它起作用吗?

1 个答案:

答案 0 :(得分:10)

IO不等于MonadIO

MonadIO是一个类型类,简单来说,意味着所讨论的monad可以执行IO操作。实际上,由于IO monad是“魔术”,所以这仅意味着以下两种情况之一:有问题的monad本身就是IO或有问题的monad {em>包装 { {1}}。

为了表达这种包装的思想,IO类型类具有方法MonadIO,该方法使您可以进行liftIO :: IO a -> m a操作并“提升”(或者,如果愿意,

将其“包裹”到monad IO中。

因此,要修正您的代码,您只需m

liftIO