gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:19:25 27 4
gpt4 key购买 nike

怎么会出现下面的

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

导致以下错误

Couldn't match type ‘m’ with ‘IO’ ‘m’ is a rigid type variable bound by the type signature for: foo :: forall (m :: * -> *). MonadIO m => m () at foo.hs:57:8 Expected type: m () Actual type: IO ()

据我所知,MonadIO 约束不应该允许它工作吗,因为 IO () 应该等于 MonadIO 吗?

最佳答案

IO 不等于 MonadIO

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

为了表达这种包装的想法,MonadIO 类型类有一个方法 liftIO::IO a -> m a,它可以让您获取 IO 操作并将其“提升”(或者,如果您愿意,将其“包装”)到 monad m 中,无论它是什么。

因此,要修复您的代码,您所需要的只是liftIO:

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

关于haskell - 即使有类型约束也无法匹配类型错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53927234/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com