已安装mtl-2.2.2却无法导入Control.Monad.Writer的问题咨询
解决GHCi中无法导入
Control.Monad.Writer的问题 我完全懂你这种明明包已经装了却找不到模块的崩溃感——别着急,这其实是mtl版本更新后的模块结构变化,再加上GHCi默认加载逻辑的小问题,咱们一步步来解决:
1. 模块路径的变动是核心原因
在mtl 2.2.x及之后的版本里,原来的Control.Monad.Writer模块已经被拆分成了两个更清晰的子模块:
Control.Monad.Writer.Lazy:使用惰性求值的Writer monad(和旧版本的Control.Monad.Writer行为一致)Control.Monad.Writer.Strict:使用严格求值的Writer monad
你可以根据自己的需求选择导入其中一个,比如想沿用旧代码的行为,就写:
import Control.Monad.Writer.Lazy
2. 确保GHCi正确加载mtl包
有时候哪怕包已经通过ghc-pkg确认安装,GHCi默认也不会自动加载非base的包,你需要手动指定:
- 启动GHCi时直接带参数:
ghci -package mtl - 或者进入GHCi后执行:
:set -package mtl,之后再运行导入命令
你还可以用:show packages命令在GHCi里查看当前加载的包列表,确认mtl是否在其中。
如果实在习惯旧的模块名,也可以通过别名兼容:
import Control.Monad.Writer.Lazy as Writer
这样就能继续用Writer.Writer、Writer.tell这类原来的写法了。
补充一句:以前的顶层
Control.Monad.Writer模块被官方标记废弃后移除,目的是明确区分惰性和严格两种实现,所以你在mtl-2.2.2里找不到它是完全正常的。
内容的提问来源于stack exchange,提问作者Saurabh kukade
相关产品推荐
相关产品推荐

