Этот код из книги "Функциональное программирование в scala"
sealed trait Stream[+A] {
def foldRight[B](z: => B)(f: (A, => B) => B): B = this match {
case Cons(h, t) => f(h(), t().foldRight(z)(f))
case _ => z
}
def exists(p: A => Boolean): Boolean = foldRight(false)((a, b) => p(a) || b)
}
case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]
Я не понимаю, что это a
и b
в exists
функциях? Как scala сопоставляет аргументы с foldRight
foldRight
и foldLeft
работают с коллекцией (поток в вашем примере), получают два параметра (базовое значение) и функцию. Эта функция также получает два параметра аккумулятор и элемент, которые обрабатываются на каждой итерации.
Аккумулятор находится сбоку от сгиба (то есть справа в foldRight
и слева в foldLeft
), поэтому в вашем случае b
— это аккумулятор.
Аккумулятор инициализируется как значение по умолчанию (false
в вашем примере)
Другой параметр (a
в вашем примере) — это каждый элемент потока, по которому вы выполняете итерацию.
В этом случае (exists
) будет повторяться до тех пор, пока элемент не удовлетворит предикату p, в противном случае он будет продолжать повторяться, пока не достигнет конца Stream
Из API
def foldRight[B](z: B)(op: (A, B) ⇒ B): B
Applies a binary operator to all elements of this sequence and a start value, going right to left.Note: will not terminate for infinite-sized collections.
B the result type of the binary operator.
z the start value.
op the binary operator.
returns the result of inserting op between consecutive elements of this sequence, going right to left with the start value z on the right:
op(x_1, op(x_2, ... op(x_n, z)...))
wherex1, ..., xn
are the elements of this sequence. Returns z if this sequence is empty.
Вы можете проверить весь API здесь
Всегда проверяйте отличный ScalaAPI (http://lampwww.epfl.ch/~hmiller/scaladoc/library/scala/collection/TraversableOnce.html)
def foldRight[B](z: B)(op: (A, B) ⇒ B): B
Из видов можно разобраться:
а -> A
б -> B
Поскольку у вас есть поток типа A
(sealed trait Stream[+A]
), a
может быть только одним из элементов потока.
b
- это значение, по которому вы накапливаете результат. В exists
он проверяет, верен ли хотя бы один элемент предиката p
.
a
иb
— это параметры, объявленные вашей лямбдой. Функция, которую вы передаете, этоf
, функцияfoldRight
вызывает ее с двумя аргументами.