Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么GHC会做这种懒惰的静态分析?_Haskell - Fatal编程技术网

Haskell 为什么GHC会做这种懒惰的静态分析?

Haskell 为什么GHC会做这种懒惰的静态分析?,haskell,Haskell,GHC将乐于编译以下内容: signum :: Float -> Int signum x | x > 0 = 1 | x == 0 = 0 没有窥视其他未处理的情况,并让它们被抛出运行时异常。TypeScript具有比此更好的静态分析。它背后的原因是什么?您发布的代码片段没有生成适当的警告的原因是GHC必须使用==和>函数的特殊情况才能生成警告。对于GHC来说,这些只是Float->Float->Bool类型的函数,没有关于其域覆盖范围的信息。一个能够捕获代码中错误的穷尽性检

GHC将乐于编译以下内容:

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确实发出警告,因为它认为警卫可能是假的,除非他们是真的或其他。