我的 Haskell * 有点生疏了,所以我可以想象我忽略了一个显而易见的事实:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = { s.foldLeft(false)((bool, elem) => bool || f(elem)) }
这些属性中是否有一个适用于它?
* 实际上是 SML,但是99% 都是一样的,但是没有人知道。
exists
实现的最大缺点是需要消耗所有可遍历的内容,而对于 any来说,如果有的话,那么它已经给出了答案。all也是如此。但是可以很容易地实现这一点,这样它就不会计算整个序列。另一种解决方案是为这种类型的操作实现单子。然后你会打电话给:
any
all
相当于 a.and(b).and(c)的 a and b and c
a.and(b).and(c)
a and b and c
没错。
顺便说一下,我发现缺少的另一个函数是 sum函数。
sum
exists:
scala> List(1,2,3).exists(_ > 2) res12: Boolean = true
在 可以通过频道。
在可导性状上存在与 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
它是预定义的,称为 exists。而 forall将是您正在寻找的“ all”函数。
forall
scala> Vector(3, 4, 5).exists(_ % 2 == 0) res1: Boolean = true scala> Vector(3, 4, 5).forall(_ % 2 == 0) res2: Boolean = false
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.)
for
break
scala.util.control.Breaks
It's correct.