Scala: “ any”和“ all”函数

我的 Haskell * 有点生疏了,所以我可以想象我忽略了一个显而易见的事实:

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

这些属性中是否有一个适用于它?

  1. 在 Scala 库的某个地方预定义
  2. 间接证据,而且写得更快
  3. 错误(我没有测试它,对不起;)

* 实际上是 SML,但是99% 都是一样的,但是没有人知道。

43536 次浏览
  1. 不,它没有预先定义这些名称。您可以使用 exists从可遍历包。
  2. 实现的最大缺点是需要消耗所有可遍历的内容,而对于 any来说,如果有的话,那么它已经给出了答案。all也是如此。但是可以很容易地实现这一点,这样它就不会计算整个序列。另一种解决方案是为这种类型的操作实现单子。然后你会打电话给:

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

  3. 没错。

顺便说一下,我发现缺少的另一个函数是 sum函数。

exists:

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

可以通过频道。

在可导性状上存在与 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. 它是预定义的,称为 exists。而 forall将是您正在寻找的“ all”函数。

    scala> Vector(3, 4, 5).exists(_ % 2 == 0)
    res1: Boolean = true
    
    
    scala> Vector(3, 4, 5).forall(_ % 2 == 0)
    res2: Boolean = false
    
  2. You can make it more performant using a for loop with a break (from scala.util.control.Breaks). (See the standard library implementation of exists and forall.)

  3. It's correct.