【问题标题】:Can GHC warn about the uses of dangerous non-total functions?GHC 可以警告使用危险的非全功能吗?
【发布时间】:2015-03-05 21:59:33
【问题描述】:

我一直在用 Haskell 快速编写一些代码,并使用了一个危险的非总函数,即fromJust(我希望输入有一个值)。稍后我会考虑我要使用哪种错误处理方式。

GHC 能否帮助我确保我已经摆脱了危险的非全部函数的所有使用(如 fromJusthead,它们可能会崩溃),在它们所在的位置给我警告。

【问题讨论】:

  • GHC 开发人员目前正在讨论偏倚推断。同时,您最好的选择可能是隐藏这些函数的导入,并(以确保它们真正被隐藏)自己重新定义它们:fromJust = () 应该可以解决问题。
  • 即使只是在一个模块中重新定义它们,作为“打开警告”的一种方式,您导入不合格。然后,您将收到一个歧义错误,指出您实际使用 Prelude 版本的任何地方(除非您当时符合条件,如Prelude.fromJust)。但是,它对您从其他模块的合格导入中使用的部分功能没有帮助。

标签: haskell error-handling crash ghc compiler-warnings


【解决方案1】:

GHC 可以警告带有 -fwarn-incomplete-patterns 的部分模式的定义(尽管不会警告使用包含不完整模式的值)。此外,Neil Mitchell 的catch 尝试进行更详细的分析,以识别部分函数的安全和不安全调用。 (当然这通常是一个无法确定的问题,所以它并不总是正确的!)

【讨论】:

  • 给我一个便条。我的想法是,每当我想在实际有用的代码中使用非完全模式匹配时(我相信在语义上我已经穷尽了所有真实案例),我不应该这样做。在某些情况下,至少应该可以通过将非全部函数包装在一个类中并将其定义在明显可以的位置附近来使假设更加明确(作为完全不安全和不可控代码的解决方法)。示例:a ToJSONObject constraint 用于一般编码并随后解构的数据。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2010-11-15
  • 2014-08-14
  • 2018-10-17
相关资源
最近更新 更多