Разумно ли Scala завершает вычисления выражений ИЛИ для операций сгиба? - PullRequest
2 голосов
/ 08 апреля 2019

Предположим, у вас есть значение val list: List[Date].Вы хотели бы знать, встречается ли какая-либо из дат в этом списке после некоторого startDate.Вы могли бы сделать это

  list.fold(false)((a, b) => startDate.compareTo(b) < 0 || a)

, которое вернуло бы true, если бы какая-либо дата произошла в или после startDate, таким образом, достигая нашей цели.

Однако, поскольку используется оператор OR, если хотя бы одна дата удовлетворяет условию startDate.compareTo(b) < 0, тогда вся операция сгиба вернет true.Есть ли у Scala способ прекратить выполнение сгиба и просто вернуть true, когда он сработает?

Ответы [ 2 ]

4 голосов
/ 08 апреля 2019

Это звучит как сценарий использования для exists.

list.exists(a => startDate.compareTo(a) < 0)

https://www.scala -lang.org / api / current / scala / collection / immutable / List.html # существует (p: А =% 3EBoolean): Boolean

4 голосов
/ 08 апреля 2019

Однако, поскольку используется оператор OR, даже если хотя бы одна дата удовлетворяет условию startDate.compareTo (b) <0, вся операция сгиба вернет true. </p>

На самом деле, не обязательно; startDate.compareTo(b) < 0 может выдать исключение. Вам нужно изменить порядок операндов на (a, b) => a || startDate.compareTo(b) < 0; даже тогда это будет правильно для List, но не, например, Stream.

Во всяком случае, насколько я знаю, ответ - нет, даже для случаев, когда он правильный. fold не может видеть внутри функции, которую она получает, только вызывает ее, поэтому для компилятора в этом случае потребуется специальная поддержка.

См. Также: Прервать в начале сгиба и https://users.scala -lang.org / t / прерывание карты или иная итерация / 1091 .

...