Scala:“任何”和“所有”功能

时间:2011-06-17 19:25:53

标签: scala functional-programming

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

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

其中一个属性是否适用于它?

  1. 在Scala库中的某处预定义
  2. 间接,并且更快写成一些单行
  3. 错了(我没试过,抱歉;))

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

4 个答案:

答案 0 :(得分:100)

  1. 它是预定义的,称为existsforall将是您正在寻找的“全部”功能。

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

  3. 这是对的。

答案 1 :(得分:6)

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

答案 2 :(得分:2)

  1. 不,不会被这些名字所预测。您可以使用Traversable包中的exists
  2. 你的实现的最大缺点是必须消耗你所有的可穿越性,如果有any,如果有的话,可能已经给你答案了。 all也是如此。但是人们很容易实现这一点,因此它不会评估整个序列。另一种解决方案是为这种类型的操作实现monad。然后你会打电话:

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

  3. 这是对的。

  4. BTW,我发现缺少的另一个功能是sum功能。

答案 3 :(得分:1)

exists

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

它在Traversable