Scala:" любые "и" все " функции
мой Haskell* немного ржавый, поэтому я могу себе представить, что мне не хватает очевидного:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
s.foldLeft(false)((bool, elem) => bool || f(elem))
}
одно из этих свойств относится к ней?
- предопределено где-то в Scala libs
- косвенный, и быстрее пишется как какой-то однострочный
- неправильно (я не проверял его, извините ;))
* на самом деле SML, но это 99% то же самое, но никто не знает под солнцем.
4 ответа:
это предопределено и называется
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.)это правильно.
методы существуют на проходимой черте, которые эквивалентны
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из пакета проходимый.самым большим недостатком вашей реализации является то, что необходимо будет потреблять все ваши проходимые, когда, для
any, если любой из них истинен, если уже может дать вам свой ответ. То же самое касаетсяall. Но можно было бы легко реализовать это так, чтобы он не оценивал всю последовательность. Другим решением было бы реализовать монаду для этого типа операции. Тогда вы бы позвонили:
a and b and cчто эквивалентноa.and(b).and(c)это правильно.
кстати, еще одна функция, которую я нахожу хватает
как о
exists:scala> List(1,2,3).exists(_ > 2) res12: Boolean = trueна проходимым.