Reputation: 8942
my Haskell* is a bit rusty, so i can imagine that I’m missing the obvious:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
s.foldLeft(false)((bool, elem) => bool || f(elem))
}
Does one of these properties apply to the it?
*actually SML, but that’s 99% the same, but known by nobody under the sun.
Upvotes: 77
Views: 48687
Reputation: 92036
It's predefined and is called exists
. And forall
would be the "all" function you are looking for.
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
.)
It's correct.
Upvotes: 141
Reputation: 3932
exists
from Traversable package.The biggest disadvantage of your implementation is that will necessary consume all of your traversible, when, for any
, if any is true, if could already give you your answer. The same goes for all
. But one could easily implement this so that it doesn't evaluate the whole sequence. Another solution would be to implement a monad for this type of operation. Then you would call:
a and b and c
which is equivalent to a.and(b).and(c)
It is correct.
BTW, another function that I find missing is a sum
function.
Upvotes: 2
Reputation: 8590
Methods exist on the Traversable trait which are equivalent to any
and 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
Upvotes: 6
Reputation: 5224
How about exists
:
scala> List(1,2,3).exists(_ > 2)
res12: Boolean = true
It's on Traversable.
Upvotes: 1