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

时间:2018-05-17 16:10:36

标签: scala methods functional-programming monads option

当我们做一些(“某些值”)。尺寸时它返回1。 当我们执行None.size时,它返回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和size为0时,size是否为1。

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

2 个答案:

答案 0 :(得分:5)

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

我没有看到isDefined应该"更有意义的任何理由"比size。这些方法都不是绝对必要的。实际上,Option上的所有方法只能用fold表示。例如,isDefined可以定义为

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

同样,size也可以通过fold

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

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

答案 1 :(得分:3)

添加了size方法,因为Options已隐式转换为IterableIterable提供有用的方法,而无需为Options专门重新实现。通过重用该代码,Options可以与所有其他容器保持一致,并且可以自行重复使用。

换句话说,它允许您将Option传递给期望Iterable的函数,其中该函数仅知道size而非Option等方法。像isDefined这样的方法。

实际上,isDefined是您并不严格需要的方法,因为它只对狭窄的Option类型有意义。它只是提供一个语义上比sizeisEmpty更好的名称。