当我们有代码契约/静态分析时,为什么我们需要Option类型?

use*_*590 2 null f# static-analysis scala code-contracts

在设计零安全代码时,更好的方法是什么?

F#和Scala具有封装null检查的Options类型,但我们也有代码契约,findbugs等静态代码分析工具.

对我来说,静态分析看起来有点清晰,那么Option/Maybe的原因是什么?特别是,什么使它更好地防止NullPointerExceptions/NullReferenceExceptions?

pad*_*pad 15

Option用于模拟计算可能返回值的事实.仅仅为了封装空检查不存在; 许多函数式编程语言,如SML,Haskell都没有,nullOption/Maybe作为建模问题的有用工具.

对我来说,静态分析看起来有点清晰,那么Option/Maybe的原因是什么?

在函数式编程的上下文中,使用静态分析来检查缺少值是否过度.静态类型检查可以做得很好(有Option).类型系统可以保证绝对正确,而静态分析工具可能有误报.

静态分析工具的另一个问题是成本高.构建它们需要花费很多(我不知道任何适用于F#和Scala的静态分析工具)并使用它们(软件购买,开发人员培训).不可否认,它们很强大,应该用于捕获更微妙的错误(静态类型检查器无法捕获),例如索引越界,整数溢出等.


Ran*_*ulz 11

Option是monadic.主要好处是透明地集成到monadic计算链中,通常使用for理解语法.

此外,我怀疑静态分析甚至可以在原则上消除了对一个值(的存在或不存在测试Some/ None区别).反正我的直觉是它等同于停止问题.


Dan*_*ral 9

首先,静态分析只有在API被注释或完整源/字节码可用时才能工作.

如果你有一个API,但实现它的实际库将在运行时决定,静态分析是无能为力的.

另一方面,静态分析本质上是有限的.图灵完整性的局限性适用,这意味着它无法在所有情况下决定某些东西是否为空.

因此,这些都是静态分析的所有限制,不是由选项类型共享,但选项类型还有一个额外的优点:它们是monad.这意味着您可以使用它们进行计算,而如果仅限于检查可空性,则必须重复自己.

最后的陈述可能不清楚,但这是事情的本质:如果你了解如何使用monad,你不需要进一步的解释; 如果你不这样做,那么解释对你没有多大帮助.学习monad用法的最好方法是使用它 - 就像编程中的其他东西一样.