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
на проходимым.