我经常使用类型洞来定义那些我知道接口并打算稍后实现的函数。当我运行cabal build
时,它会在遇到带有类型洞的第一个模块后停止,隐藏其他模块中可能存在的类型错误。
有没有一种方法可以对项目进行类型检查,并仅在整个项目构建和类型检查之后才因类型洞而失败?
我经常使用类型洞来定义那些我知道接口并打算稍后实现的函数。当我运行cabal build
时,它会在遇到带有类型洞的第一个模块后停止,隐藏其他模块中可能存在的类型错误。
有没有一种方法可以对项目进行类型检查,并仅在整个项目构建和类型检查之后才因类型洞而失败?
@chi 很客气地告诉我要阅读文档。似乎有两种配置类型空洞的方法:
默认行为会导致编译时错误,这将导致在遇到具有类型空洞的第一个模块后停止编译,并在其他模块中隐藏类型错误和类型空洞。
-fdefer-typed-holes
会在遇到类型空洞时发出警告,并继续编译项目的其余部分。如果没有遇到其他错误,则构建二进制文件,并将类型空洞降级为运行时错误。一方面,所有空洞都会显示在编译器输出中,但另一方面,这并不理想,因为这允许构建成功。
然而,有一种稍微hacky的标志组合可以获得(几乎)所需的行为:
-fdefer-typed-holes -Werror=typed-holes
这个程序会对项目中的每个模块进行类型检查,如果有任何(非洞)类型错误,则停止。如果给定模块中没有错误,则构建过程会打印出项目中所有已经确定类型的洞,并继续对项目进行类型检查。只有在遇到没有类型错误或已确定类型的洞时,构建才会成功。
如果我们能够在同一个输出中获得类型错误和已确定类型的洞,那就更好了,但你不能得到所有东西。
-fdefer-typed-holes
标志来运行和测试包含洞(即缺少代码)的代码。此标志将将由类型洞产生的错误推迟到运行时,并将其转换为编译时警告。这些警告又可以通过-Wno-typed-holes
完全消除。
-fdefer-typed-holes
жүҖеҫ—еҲ°зҡ„гҖӮеҸӘжңүеҪ“жӮЁеҗҢж—¶дҪҝз”Ё-Wno-typed-holes
жҳҫејҸзҰҒз”ЁиӯҰе‘Ҡж—¶пјҢзұ»еһӢз©әжҙһжүҚдјҡжҲҗдёәзәҜзІ№зҡ„иҝҗиЎҢж—¶й”ҷиҜҜгҖӮ - Ben