斯卡拉:“任何”和“所有”function
我的Haskell *有点生疏,所以我可以想象,我错过了显而易见的:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = { s.foldLeft(false)((bool, elem) => bool || f(elem)) }
这些属性之一是否适用于它?
- 预定义在Scala库的某处
- 间接的,更快的写成一些单线
- 错了(我没有testing,很抱歉;))
*实际上是SML,但这99%是相同的,但在阳光下没人知道。
-
这是预定义的,被称为
exists
。 而所有将是你正在寻找的“全部”function。scala> Vector(3, 4, 5).exists(_ % 2 == 0) res1: Boolean = true scala> Vector(3, 4, 5).forall(_ % 2 == 0) res2: Boolean = false
-
你可以使用
for
循环(来自scala.util.control.Breaks
)来使其更具性能。 (请参阅标准库的exists
和实现。) -
这是正确的。
在Traversable特质方面存在的方法相当于any
和all
:
def all[A](xs: Traversable[A], p: A => Boolean): Boolean = xs forall p def any[A](xs: Traversable[A], p: A => Boolean): Boolean = xs exists p
- 不,它不会被这些名字所玷污。 您可以使用Traversable包中的
exists
。 -
你的实现的最大的缺点是,如果有的话,如果已经给你答案的话,将会消耗你所有的遍历。
all
。 但是人们可以很容易地实现这一点,以便它不评估整个序列。 另一种解决scheme是为这种types的操作实现monad。 那么你会打电话给:a and b and c
相当于a and b and c
a.and(b).and(c)
-
它是正确的。
顺便说一句,另一个function,我觉得缺less的是一个sum
function。
如何exists
:
scala> List(1,2,3).exists(_ > 2) res12: Boolean = true
这是在Traversable 。