Scala:" любые "и" все " функции


мой Haskell* немного ржавый, поэтому я могу себе представить, что мне не хватает очевидного:

def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
    s.foldLeft(false)((bool, elem) => bool || f(elem))
}

одно из этих свойств относится к ней?

  1. предопределено где-то в Scala libs
  2. косвенный, и быстрее пишется как какой-то однострочный
  3. неправильно (я не проверял его, извините ;))

* на самом деле SML, но это 99% то же самое, но никто не знает под солнцем.

4 58

4 ответа:

  1. это предопределено и называется exists. И forall будет функция "все", которую вы ищете.

    scala> Vector(3, 4, 5).exists(_ % 2 == 0)
    res1: Boolean = true
    
    scala> Vector(3, 4, 5).forall(_ % 2 == 0)
    res2: Boolean = false
    
  2. вы можете сделать его более производительным, с помощью for петли с break (от scala.util.control.Breaks). (См. стандартную реализацию библиотеки exists и forall.)

  3. это правильно.

методы существуют на проходимой черте, которые эквивалентны 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
  1. нет, это не предопределено с этими именами. Вы можете использовать exists из пакета проходимый.
  2. самым большим недостатком вашей реализации является то, что необходимо будет потреблять все ваши проходимые, когда, для any, если любой из них истинен, если уже может дать вам свой ответ. То же самое касается all. Но можно было бы легко реализовать это так, чтобы он не оценивал всю последовательность. Другим решением было бы реализовать монаду для этого типа операции. Тогда вы бы позвонили:

    a and b and c что эквивалентно a.and(b).and(c)

  3. это правильно.

кстати, еще одна функция, которую я нахожу хватает

как о exists:

scala> List(1,2,3).exists(_ > 2)
res12: Boolean = true

на проходимым.