Как работает сопоставление с образцом в существующей функции? - PullRequest
3 голосов
/ 09 апреля 2019

Этот код из книги "Функциональное программирование в 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 func?Как scala сопоставляет аргументы с foldRight

Ответы [ 2 ]

3 голосов
/ 09 апреля 2019

foldRight и foldLeft работают над коллекцией (поток в вашем примере), получают два параметра (базовое значение) и функцию. Эта функция получает также два параметра - аккумулятор и элемент, которые обрабатывают в каждой итерации

Аккумулятор находится сбоку от сгиба (то есть справа foldRight и слева foldLeft), поэтому в вашем случае b является аккумулятором.

Аккумулятор инициализируется как значение по умолчанию (false в вашем примере)

Другой параметр (a в вашем примере) - это каждый элемент потока, по которому вы выполняете итерацию.

В этом случае (exists) будет повторяться до тех пор, пока элемент не удовлетворяет предикату p, в противном случае он будет повторяться до тех пор, пока не достигнет конца Stream

Из API

def foldRight[B](z: B)(op: (A, B) ⇒ B): B Применяет бинарный оператор к все элементы этой последовательности и начальное значение, идущие справа налево.

Примечание: не прекращается для коллекций бесконечного размера.

B the result type of the binary operator.

z the start value.

op the binary operator.

возвращает результат вставки op между последовательными элементами эта последовательность, идущая справа налево с начальным значением z на право:

op(x_1, op(x_2, ... op(x_n, z)...)), где x1, ..., xn - элементы этой последовательности. Возвращает z, если эта последовательность пуста.

Вы можете проверить весь API здесь

2 голосов
/ 09 апреля 2019

Всегда проверяйте отличный ScalaAPI (http://lampwww.epfl.ch/~hmiller/scaladoc/library/scala/collection/TraversableOnce.html)

def foldRight[B](z: B)(op: (A, B) ⇒ B): B

Из типов вы можете понять это:

a -> A

b -> B

  • Поскольку у вас есть поток типа A (sealed trait Stream[+A]) a может быть только одним из элементов потока.

  • b - это значение, по которому вы накапливаете результат. В exists проверяется, является ли один элемент истинным для предиката p.

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