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
操作并将其“提升”(或者,如果您愿意,“包装”到monadm
中,不管是什么
所以,要修复您的代码,您只需要liftIO
:
foo :: MonadIO m => m ()
foo = liftIO $ print "hi"