斯卡拉:“任何”和“所有”function

我的Haskell *有点生疏,所以我可以想象,我错过了显而易见的:

def any[A](s: Traversable[A], f: A => Boolean): Boolean = { s.foldLeft(false)((bool, elem) => bool || f(elem)) } 

这些属性之一是否适用于它?

  1. 预定义在Scala库的某处
  2. 间接的,更快的写成一些单线
  3. 错了(我没有testing,很抱歉;))

*实际上是SML,但这99%是相同的,但在阳光下没人知道。

  1. 这是预定义的,被称为exists 。 而所有将是你正在寻找的“全部”function。

     scala> Vector(3, 4, 5).exists(_ % 2 == 0) res1: Boolean = true scala> Vector(3, 4, 5).forall(_ % 2 == 0) res2: Boolean = false 
  2. 你可以使用for循环(来自scala.util.control.Breaks )来使其更具性能。 (请参阅标准库的exists和实现。)

  3. 这是正确的。

在Traversable特质方面存在的方法相当于anyall

 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 
  1. 不,它不会被这些名字所玷污。 您可以使用Traversable包中的exists
  2. 你的实现的最大的缺点是,如果有的话,如果已经给你答案的话,将会消耗你所有的遍历。 all 。 但是人们可以很容易地实现这一点,以便它不评估整个序列。 另一种解决scheme是为这种types的操作实现monad。 那么你会打电话给:

    a and b and c相当于a and b and c a.and(b).and(c)

  3. 它是正确的。

顺便说一句,另一个function,我觉得缺less的是一个sumfunction。

如何exists

 scala> List(1,2,3).exists(_ > 2) res12: Boolean = true 

这是在Traversable 。