类型检查一个带有类型空洞的项目。

7

我经常使用类型洞来定义那些我知道接口并打算稍后实现的函数。当我运行cabal build时,它会在遇到带有类型洞的第一个模块后停止,隐藏其他模块中可能存在的类型错误。

有没有一种方法可以对项目进行类型检查,并仅在整个项目构建和类型检查之后才因类型洞而失败?

2个回答

5

@chi 很客气地告诉我要阅读文档。似乎有两种配置类型空洞的方法:

  • 默认行为会导致编译时错误,这将导致在遇到具有类型空洞的第一个模块后停止编译,并在其他模块中隐藏类型错误和类型空洞。

  • -fdefer-typed-holes 会在遇到类型空洞时发出警告,并继续编译项目的其余部分。如果没有遇到其他错误,则构建二进制文件,并将类型空洞降级为运行时错误。一方面,所有空洞都会显示在编译器输出中,但另一方面,这并不理想,因为这允许构建成功。

然而,有一种稍微hacky的标志组合可以获得(几乎)所需的行为:

-fdefer-typed-holes -Werror=typed-holes

这个程序会对项目中的每个模块进行类型检查,如果有任何(非洞)类型错误,则停止。如果给定模块中没有错误,则构建过程会打印出项目中所有已经确定类型的洞,并继续对项目进行类型检查。只有在遇到没有类型错误或已确定类型的洞时,构建才会成功。

如果我们能够在同一个输出中获得类型错误和已确定类型的洞,那就更好了,但你不能得到所有东西。


3
这段摘自文档,它包含了所有的信息。
“Found hole” 错误通常像其他类型错误一样终止编译。毕竟,你已经从程序中省略了一些代码。然而,你可以使用 -fdefer-typed-holes 标志来运行和测试包含洞(即缺少代码)的代码。此标志将将由类型洞产生的错误推迟到运行时,并将其转换为编译时警告。这些警告又可以通过-Wno-typed-holes完全消除。

如果这些错误能够保持在编译时期就好了,但看起来这已经是我们能得到的最好结果了。 - Ari Fordsham
@AriFordsham дёҖдёӘвҖңзј–иҜ‘ж—¶й”ҷиҜҜпјҢдёҚдјҡеҒңжӯўжһ„е»әвҖқзҡ„иӯҰе‘ҠпјӣиҝҷжӯЈжҳҜжӮЁдҪҝз”Ё-fdefer-typed-holesжүҖеҫ—еҲ°зҡ„гҖӮеҸӘжңүеҪ“жӮЁеҗҢж—¶дҪҝз”Ё-Wno-typed-holesжҳҫејҸзҰҒз”ЁиӯҰе‘Ҡж—¶пјҢзұ»еһӢз©әжҙһжүҚдјҡжҲҗдёәзәҜзІ№зҡ„иҝҗиЎҢж—¶й”ҷиҜҜгҖӮ - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接