Scala: “any” and “all” functions
ScalaFunctional ProgrammingScala Problem Overview
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?
- predefined somewhere in the Scala libs
- circumstantial, and faster written as some one-liner
- wrong (I didn’t test it, sorry ;))
*actually SML, but that’s 99% the same, but known by nobody under the sun.
Scala Solutions
Solution 1 - Scala
-
It's predefined and is called
exists
. Andforall
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 abreak
(fromscala.util.control.Breaks
). (See the standard library implementation ofexists
andforall
.) -
It's correct.
Solution 2 - Scala
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
Solution 3 - Scala
-
No it isn't predifined with those names. You can use
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 forall
. 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 toa.and(b).and(c)
-
It is correct.
BTW, another function that I find missing is a sum
function.