cabal repl启动的GHCi类型校验变严的原因及恢复默认方法
问题原因
这个报错完全是cabal项目默认的GHC编译参数配置导致的,和GHCi本身的类型推导逻辑没有关系:
- 直接全局启动GHCi时,默认不会把类型默认推导的提示当成错误:你输入
6 * 7这类没标注具体类型的多态数值表达式,GHC会按内置规则把Num类型约束默认推导为Integer,自动匹配打印需要的Show实例,直接算出结果输出。 - 新版cabal通过
cabal init生成的项目模板,默认会启用一套严格的警告规则,同时携带-Werror参数,把所有警告直接升级成阻断运行的错误。你看到的报错里明确标注了-Werror=type-defaults,意思就是本来只是提示级别的「GHC自动帮你选择了默认类型」事件,被配置成了必须修正的错误,所以不手动标注类型就会阻断执行。
恢复默认便捷推导的配置方法
按自己的使用场景选择对应方案即可:
- 临时适配当前打开的repl会话:进入cabal repl之后直接输入指令
:set -Wno-type-defaults回车,之后再输入6 * 7这类无类型标注的表达式就能正常输出结果,关闭当前repl后配置自动失效。 - 给单个项目永久配置:打开项目根目录下后缀为
.cabal的配置文件,找到你启动的Example对应的组件段(一般是executable开头的配置段),定位到ghc-options配置项,在原有参数末尾追加-Wno-type-defaults即可。比如原有配置为ghc-options: -Wall -Wcompat -Werror,修改后为ghc-options: -Wall -Wcompat -Werror -Wno-type-defaults,保存后重新启动cabal repl就会生效。 - 全局所有环境生效:找到个人用户目录下的GHCi配置文件,Linux/macOS系统路径为
~/.ghc/ghci.conf,Windows系统路径为%APPDATA%\ghc\ghci.conf,文件不存在可以手动创建,在文件内添加一行:set -Wno-type-defaults,之后不管是全局启动GHCi还是通过cabal启动repl,都不会再触发这个类型默认报错。 - 单次启动临时使用、不想修改任何配置,可以直接在启动命令中传入GHC参数:
cabal repl Example --ghc-options="-Wno-type-defaults",配置仅对本次打开的repl会话有效。
补充说明:这个严格规则本来是为大型项目规避隐式类型默认导致的隐蔽bug设计的,如果你是初学阶段跑简单示例,关掉这个校验不会产生任何负面影响。
内容的提问来源于stack exchange,提问作者kewCogs
相关产品推荐
相关产品推荐

