Haskell 为什么GHC会做这种懒惰的静态分析?
GHC将乐于编译以下内容:Haskell 为什么GHC会做这种懒惰的静态分析?,haskell,Haskell,GHC将乐于编译以下内容: signum :: Float -> Int signum x | x > 0 = 1 | x == 0 = 0 没有窥视其他未处理的情况,并让它们被抛出运行时异常。TypeScript具有比此更好的静态分析。它背后的原因是什么?您发布的代码片段没有生成适当的警告的原因是GHC必须使用==和>函数的特殊情况才能生成警告。对于GHC来说,这些只是Float->Float->Bool类型的函数,没有关于其域覆盖范围的信息。一个能够捕获代码中错误的穷尽性检
signum :: Float -> Int
signum x
| x > 0 = 1
| x == 0 = 0
没有窥视其他未处理的情况,并让它们被抛出运行时异常。TypeScript具有比此更好的静态分析。它背后的原因是什么?您发布的代码片段没有生成适当的警告的原因是GHC必须使用==和>函数的特殊情况才能生成警告。对于GHC来说,这些只是Float->Float->Bool类型的函数,没有关于其域覆盖范围的信息。一个能够捕获代码中错误的穷尽性检查器必须连接到GHC已经非常复杂的穷尽性检查器上,它将以复杂的方式与之交互,仅针对这两个函数 不过,在Haskell中,我们倾向于不编写这样的代码。要完成相同的任务,您应该编写以下内容:
signum :: Float -> Int
signum x
| x > 0 = 1
| x == 0 = 0
符号::浮点->整数
signum x=案例比较x 0
燃气轮机->1
等式->0
这减少了您必须进行的比较的数量,并且它确实会为您与-Wall的丢失案例提供警告。您需要添加:
符号::浮点->整数
signum x=案例比较x 0
燃气轮机->1
等式->0
LT->-1
这种穷尽性检查比仅仅捕获一些数字比较更通用、更强大,如果您知道如何使用它,它可以捕获所有相同的错误。它做得并不愉快。Set-Wincomplete patterns/-Wall.GHC对非穷举模式匹配进行了一些合理的静态分析,如上面所述,但要从中受益,必须打开警告,或者IMO,更好地使用-Werror=不完整模式。就我个人而言,我对非详尽模式的要求相当严格,因此我会将该错误作为默认错误,但它不是一个交易破坏者,因为我们可以打开它。为什么要投否决票?我不同意第一句话:GHC确实发出警告,因为它认为警卫可能是假的,除非他们是真的或其他。