为什么Some(x).map(_ => null)不能评估为None?

Hak*_*rce 1 scala optional

我最近在Scala遇到了一个令人困惑的问题.我希望得到以下代码None,但结果是Some(null):

Option("a").map(_ => null)
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?为什么不导致None

注意:这个问题不是为什么有些(null)不被视为无重复,因为问题要求明确使用Some(null).我的问题是关于使用Option.map.

Chr*_*tin 8

每次我们为规则添加例外时,我们都会剥夺自己推理代码的工具.

映射Some总是评估为a Some.这是一个简单而有用的法律.如果我们要提出改变建议,我们将不再拥有该法律.例如,我们可以肯定地说这是一件事.对于所有的f,x以及y:

Some(x).map(f).map(_ => y) == Some(y)
Run Code Online (Sandbox Code Playgroud)

如果我们要提出你提出的改变,那么这个陈述将不再是真实的; 具体而言,它不适用于哪些情况f(x) == null.

而且,Option是一个算子.Functor是对具有map函数的事物的有用概括,并且它具有与关于映射应如何工作的直觉很好地对应的规律.如果我们要做出你提出的改变,Option那就不再是一个仿函数了.

nullScala中的一种异常现象仅存在于与Java库的互操作性.抛弃Option作为仿函数的有效性并不是一个好理由.