Изучая Функциональное программирование на Scala, я наткнулся на следующий фрагмент кода:
def foldRight[A](z: => B)(f: (A,=>B) => B):B = uncons match {
case Some((h,t)) => f(h,t.foldRight(z)(f))
case None => z
}
Затем авторы идут дальше и заявляют следующее:
Это выглядит очень похоже на foldRight, который мы написали для List, но обратите внимание, что наша функция объединения f не является строгой по второму параметру. Если f решает не оценивать свой второй параметр, обход завершается досрочно. Мы можем увидеть это, используя foldRight для реализации exists, которая проверяет, соответствует ли какое-либо значение в потоке заданному предикату.
Далее автор сообщает следующее:
def exists(p: A => Boolean): Boolean =
foldRight(false)((a, b) => p(a) || b)
Мой вопрос заключается в том, как функция объединения f вызывает досрочное завершение существующего метода? Я не думаю, что смог понять, как это происходит из текста.