已导入transformers包,为何仍出现hoistMaybe未在作用域的编译错误?
解决
hoistMaybe不在作用域的问题 问题根源
你碰到的问题是因为GHC 9.4.2自带的transformers版本低于0.6.0.3,而hoistMaybe是transformers 0.6.0.3版本才新增的函数。虽然你在Cabal里声明了transformers依赖,但没指定版本,Cabal会默认用GHC捆绑的旧版本(GHC 9.4.2捆绑的transformers是0.6.0.1),自然找不到这个函数。
两种解决办法
办法一:升级transformers版本
- 修改Cabal文件,明确指定transformers的最低版本:
cabal-version: 3.0 build-depends: base , transformers >= 0.6.0.3
- 重新构建项目:
cabal build
Cabal会自动拉取符合版本要求的transformers包,之后编译就能找到hoistMaybe了。
办法二:手动实现hoistMaybe
如果不想升级依赖,直接在你的模块里添加这段代码就行——hoistMaybe的逻辑本身很简单:
hoistMaybe :: Maybe a -> MaybeT m a hoistMaybe = MaybeT . pure
添加后就能直接用,效果和官方实现完全一致。
验证示例
修改后可以用这段代码测试是否正常工作:
main :: IO () main = void $ runMaybeT $ do x <- hoistMaybe (Just 5) :: MaybeT IO Int print x
运行后会输出5,说明功能正常。
内容的提问来源于stack exchange,提问作者rexcfnghk
相关产品推荐
相关产品推荐

