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

Scala 当我们有代码契约/静态分析时,为什么需要选项类型?,scala,f#,null,static-analysis,code-contracts,Scala,F#,Null,Static Analysis,Code Contracts,在设计空安全的代码时,更好的方法是什么 F#和Scala有封装空检查的选项类型,但我们也有静态代码分析工具,如代码契约、findbugs 对我来说,静态分析似乎有点干净,那么选择/可能的原因是什么?特别是,是什么使它能够更好地防止NullPointerException/NullReferenceException?选项是一元的。一个主要的好处是透明地集成到一元计算链中,通常使用for理解语法 此外,我怀疑静态分析甚至在原则上可以避免测试值的存在或不存在(部分/无区别)。我的直觉是,这相当于停止

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

F#和Scala有封装空检查的选项类型,但我们也有静态代码分析工具,如代码契约、findbugs


对我来说,静态分析似乎有点干净,那么选择/可能的原因是什么?特别是,是什么使它能够更好地防止NullPointerException/NullReferenceException?

选项
是一元的。一个主要的好处是透明地集成到一元计算链中,通常使用
for
理解语法


此外,我怀疑静态分析甚至在原则上可以避免测试值的存在或不存在(部分/
区别)。我的直觉是,这相当于停止问题。

首先,静态分析只能在API有注释或完整源代码/字节码可用的情况下工作

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

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

因此,这些都是静态分析的局限性,选项类型并不共享,但选项类型还有一个额外的优势:它们是单子。这意味着您可以使用它们编写计算,而如果限制为if检查是否为null,则必须求助于重复自己


最后一句话可能不清楚,但这是事情的本质:如果你了解单子是如何使用的,你就不需要进一步的解释;如果你不这样做,那么解释对你没有多大帮助。学习单子用法的最好方法是使用它——实际上,与编程中的所有其他方法一样。

选项
用于模拟计算可能返回值这一事实。它的存在不仅仅是为了封装空检查;许多函数式编程语言,如SML、Haskell没有
null
,但
Option/Maybe
是建模问题的有用工具

对我来说,静态分析似乎有点干净,那么选择/可能的原因是什么

在函数式编程的上下文中,使用静态分析检查值的缺失是过分的。静态类型检查可以做得很好(使用
选项
)。类型系统可以保证绝对正确性,而静态分析工具可能存在误报


静态分析工具的另一个问题是成本高。构建它们(我不知道F#和Scala有什么好的静态分析工具)和使用它们(软件购买、开发人员培训)需要花费很多。诚然,它们功能强大,应该用于捕获更细微的错误(静态类型检查器无法捕获),例如索引越界、整数溢出等。

首先,选项类型是什么?它如何与模式匹配和
for
一起使用?(选项不是关于“查找bug”,而是关于以一致的方式正确建模问题;null是Java/JVM借用的一个不幸方面,因此也是Scala借用的一个方面。)我不认为这是一个“坏”问题,但我认为它设置了一个不适当的二元性。使用选项/可能不排除其他工具;同样,也不排除测试。@ PST NULL也是一种非常有效的方法来声明指针类型无效的任何语言,它允许接近硬件层(汇编程序、C语言、C++语言,并且可能更多)。“如果每个基本数字类型都有一个空值,比如Double.NAN,那就太好了。”我不同意。对于未公开“null”的语言(即该语言可能只需要表示Haskell之类的“某物或某物”),如何在内部处理“null”是一个实现细节。例如,Java实现使用指针,但Java中没有指针!没有理由认为它必须“效率更低”。此外,案例C#显示,可以在原语上以最小的开销创建类型:但是.NET可空类型并不像Option/Maybe那样统一。@ziggystar在这一点上,每个具有空值的“现代高级语言”只是由于没有解决这个问题的基本思想。这就是ALGO的工作原理。这就是C的工作原理。这就是Java的工作原理。这就是C#的工作原理。这并不意味着这是最好的方式;各种非空分析可以检测可证明的非空与可能的空,并防止后者(除非它变成可证明的非空值)-在这种情况下,两者都不能做更多(或更少)。一个只需要某个匹配项(或映射或诸如此类),而另一个则需要
if(x!=null){use(x)}
。。现在,如果Scala禁止对选项类型使用
null
,并禁止创建一些(null),那么。。但这两种方法都以不同的方式遇到了“边界”问题。也就是说,第一段+1——直到人们使用Option/Maybe作为它的本来面目(而不是简单的“null-guard”),人们无法真正享受Option/Maybe类型的存在。+1虽然有“notnull”属性和其他类似的“代码契约”,可以公开/编码比方法名和参数多得多的信息(即使不是类型本身的一部分)。。与C#等语言的Visual Studio(+扩展)相比,Scala工具简直太差劲了。这就是所有这些:(