Haskell 不能';即使有类型约束,也无法匹配类型错误

Haskell 不能';即使有类型约束,也无法匹配类型错误,haskell,Haskell,为什么会出现以下情况 foo :: MonadIO m => m () foo = print "hi" 导致以下错误 无法将类型“m”与“IO”匹配 “m”是一个刚性类型变量,由 以下项的类型签名: foo::forall(m::*->*)。单体m=>m() 福斯:57:8 预期类型:m() 实际类型:IO() 据我所知,既然IO()应该等于MonadIO,MonadIO约束不应该允许这样做吗?IO不等于MonadIO MonadIO是一个类型类,简单地说,它意味着所讨论的monad可

为什么会出现以下情况

foo :: MonadIO m => m ()
foo = print "hi"
导致以下错误

无法将类型“m”与“IO”匹配 “m”是一个刚性类型变量,由 以下项的类型签名: foo::forall(m::*->*)。单体m=>m() 福斯:57:8 预期类型:m() 实际类型:IO()


据我所知,既然IO()应该等于MonadIO,MonadIO约束不应该允许这样做吗?

IO
不等于
MonadIO

MonadIO
是一个类型类,简单地说,它意味着所讨论的monad可以执行IO操作。实际上,由于
IO
monad是“魔法”,这只能意味着两件事中的一件:所讨论的monad是
IO
本身,或者所讨论的monad以某种方式包装
IO

为了表达这种包装思想,
MonadIO
类型类有一个方法
liftIO::ioa->ma
,它允许您执行
IO
操作并将其“提升”(或者,如果您愿意,“包装”到monad
m
中,不管是什么

所以,要修复您的代码,您只需要
liftIO

foo :: MonadIO m => m ()
foo = liftIO $ print "hi"