GHC警告仅删除中间文件才显示?如何始终触发警告?
这确实是GHC的预期行为,我来帮你理清楚原因和解决办法
为什么会出现这种情况?
GHC在编译Haskell代码时,会生成两个关键的中间文件:
.hi:接口文件,存储了模块的类型信息和接口定义.o:目标文件,编译后的机器码
第一次执行ghc -Wall foo.hs时,GHC会完整解析、类型检查你的源码,发现main没有类型签名,就输出对应的警告,同时生成.hi和.o文件。
当你立即重新执行相同命令时,GHC会检查源码文件和中间文件的修改时间:如果源码没有变化,它会认为已经有最新的编译产物,直接跳过类型检查和编译的核心步骤,自然不会再输出警告。只有当你删除.hi和.o(相当于告诉GHC“没有可用的中间产物”),它才会重新执行完整流程,警告也就再次出现了。
如何无需删除中间文件就始终显示警告?
有几个简单的方法可以实现:
- 强制重新编译:每次编译时加上
-fforce-recomp参数,这个参数会让GHC忽略现有的中间文件,强制重新执行完整的编译流程(包括类型检查),命令如下:ghc -Wall -fforce-recomp foo.hs - 仅检查编译(不生成可执行文件):如果你只是想检查警告,不需要生成可执行文件,可以用
-c参数配合-fforce-recomp:ghc -Wall -c -fforce-recomp foo.hs - 使用代码检查工具:比如
hlint(一个专门的Haskell代码静态检查工具),它每次运行都会直接扫描你的源码文件,不受中间编译产物的影响,能输出包括类型签名缺失在内的各类代码建议。
内容的提问来源于stack exchange,提问作者Francisco Pizarro
相关产品推荐
相关产品推荐

