scala 中 (Monad) Option.size 的可能用途是什么

What is the possible use of (Monad) Option.size in scala

当我们做 Some(“some values”).size it returns 1. 当我们做 None.size 它 returns 0. 我想知道在一个选项上可能使用 size 方法的可能是什么。

val x = Some(1,2,3,4).size
println(x) // prints 1
val y = Some(List(“a”, ”b”, ”c”, ”d”))
println(y) //it also print 1

当我们要为 Some 中的任何类型的值设置 1 而为 None 设置 0 时。这种大小方法比 Option 有什么用。

我能想到的一个可能的用途是在 None 和大小为 0 时知道选项是否在 (Some) 和大小为 1 的情况下定义。

但是 is 没有意义,因为我们已经有 isDefined 来检查它。

添加了 size 方法,因为 Options 被隐式转换为 IterableIterable 提供了 有用的方法,而无需专门为 Options 重新实现。通过重用该代码,Options 获得了与所有其他容器的一致性,并且它们自身的可重用性更高。

换句话说,它允许您将 Option 传递给需要 Iterable 的函数,其中该函数只知道 size 而不是 Option 之类的方法-特定方法,如 isDefined.

实际上,isDefined 是您不需要的方法,因为它只对窄 Option 类型有意义。它只是为了提供比 sizeisEmpty.

在语义上更好的名称

size 方法与 Option 也是 monad 的事实没有任何关系。 monad 的概念非常笼统,它适用于很多事情,所有这些事情通常会有更多的方法,而不仅仅是 unitflatMapOption 有一个 size 方法,因为它可以通过 Option.option2iterable 隐式转换为 Iterable。这是有道理的,因为 Option 是一个最多只有一个元素的集合。

我看不出 isDefined 应该 "make more sense" 而不是 size 的任何原因。 None 这些方法是绝对必要的。事实上,Option 上的 all 方法只能用 fold 来表示。例如,isDefined 可以定义为

def isDefined = fold(false){ _ => true }

同样,size也可以通过fold定义:

def size = fold(0){ _ => 1 }

现在是否意味着我们应该丢弃除fold之外的所有方法?一点都不。 "Rich interfaces" 实现为提供大量派生方法的特征可能是 Scala 的集合比 Java 的集合使用起来更愉快的主要原因。到现在为止,差异已经变小了,因为 Java 也引入了做类似事情的默认方法实现,但这再次表明丰富的接口本质上是有用的。