You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:35:40