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
被隐式转换为 Iterable。 Iterable
提供了 吨 有用的方法,而无需专门为 Options
重新实现。通过重用该代码,Options
获得了与所有其他容器的一致性,并且它们自身的可重用性更高。
换句话说,它允许您将 Option
传递给需要 Iterable
的函数,其中该函数只知道 size
而不是 Option
之类的方法-特定方法,如 isDefined
.
实际上,isDefined
是您不需要的方法,因为它只对窄 Option
类型有意义。它只是为了提供比 size
或 isEmpty
.
在语义上更好的名称
size
方法与 Option
也是 monad 的事实没有任何关系。 monad
的概念非常笼统,它适用于很多事情,所有这些事情通常会有更多的方法,而不仅仅是 unit
和 flatMap
。 Option
有一个 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 也引入了做类似事情的默认方法实现,但这再次表明丰富的接口本质上是有用的。
当我们做 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
被隐式转换为 Iterable。 Iterable
提供了 吨 有用的方法,而无需专门为 Options
重新实现。通过重用该代码,Options
获得了与所有其他容器的一致性,并且它们自身的可重用性更高。
换句话说,它允许您将 Option
传递给需要 Iterable
的函数,其中该函数只知道 size
而不是 Option
之类的方法-特定方法,如 isDefined
.
实际上,isDefined
是您不需要的方法,因为它只对窄 Option
类型有意义。它只是为了提供比 size
或 isEmpty
.
size
方法与 Option
也是 monad 的事实没有任何关系。 monad
的概念非常笼统,它适用于很多事情,所有这些事情通常会有更多的方法,而不仅仅是 unit
和 flatMap
。 Option
有一个 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 也引入了做类似事情的默认方法实现,但这再次表明丰富的接口本质上是有用的。