Scala: “any” and “all” functions
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.
It's predefined and is called
exists. Andforallwould 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 = falseYou can make it more performant using a
forloop with abreak(fromscala.util.control.Breaks). (See the standard library implementation ofexistsandforall.)It's correct.
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
- No it isn't predifined with those names. You can use
existsfrom 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 cwhich is equivalent toa.and(b).and(c)It is correct.
BTW, another function that I find missing is a sum function.
How about exists:
scala> List(1,2,3).exists(_ > 2)
res12: Boolean = true
It's on Traversable.
加载中,请稍侯......
精彩评论