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

Ram*_*hra 0 methods monads functional-programming scala 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
Run Code Online (Sandbox Code Playgroud)

当我们在Some中有任何类型的值时为1,而对于None则为0.这种尺寸方法比Option更有用.

我能想到的一个可能用途是知道是否在(Some)和大小为1时定义了该选项,当None和size为0时.

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

And*_*kin 5

size方法与Optionmonad 事实无关.的概念monad是相当普遍的,它适用于很多的事情,所有这些事情通常都会有很多的方法,只是unitflatMap.Option有一个size方法,因为它可以通过隐式转换Option.option2iterableIterable.这是有道理的,因为a Option是一个至多包含一个元素的集合.

我没有看到任何理由为什么isDefined"更有意义"而不是size.这些方法都不是绝对必要的.事实上,所有方法Option都只能用表达方式表达fold.例如,isDefined可以定义为

def isDefined = fold(false){ _ => true }
Run Code Online (Sandbox Code Playgroud)

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

def size = fold(0){ _ => 1 }
Run Code Online (Sandbox Code Playgroud)

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