Scala: «любые» и «все» функции - PullRequest
60 голосов
/ 17 июня 2011

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

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

Применимо ли к нему одно из этих свойств?

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

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

Ответы [ 4 ]

101 голосов
/ 17 июня 2011
  1. Это предопределено и называется existsforall будет «все» функция, которую вы ищете.

    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. Это правильно.

6 голосов
/ 17 июня 2011

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

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

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

Кстати, еще одна функция, которую мне не хватает, - это sum функция.

1 голос
/ 17 июня 2011

Как насчет exists:

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

Включено Отслеживается .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...