我的Haskell *有点生疏,所以我可以想象我错过了显而易见的事情:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
s.foldLeft(false)((bool, elem) => bool || f(elem))
}
其中一个属性是否适用于它?
*实际上是SML,但99%相同,但在阳光下没人知道。
答案 0 :(得分:100)
它是预定义的,称为exists
。 forall
将是您正在寻找的“全部”功能。
scala> Vector(3, 4, 5).exists(_ % 2 == 0)
res1: Boolean = true
scala> Vector(3, 4, 5).forall(_ % 2 == 0)
res2: Boolean = false
您可以使用for
循环break
(来自scala.util.control.Breaks
)使其更高效。 (请参阅exists
和forall
的标准库实现。)
这是对的。
答案 1 :(得分:6)
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
答案 2 :(得分:2)
exists
。你的实现的最大缺点是必须消耗你所有的可穿越性,如果有any
,如果有的话,可能已经给你答案了。 all
也是如此。但是人们很容易实现这一点,因此它不会评估整个序列。另一种解决方案是为这种类型的操作实现monad。然后你会打电话:
a and b and c
,相当于a.and(b).and(c)
这是对的。
BTW,我发现缺少的另一个功能是sum
功能。
答案 3 :(得分:1)