Как работает сопоставление с образцом в существующей функции?

Этот код из книги "Функциональное программирование в 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

a и b — это параметры, объявленные вашей лямбдой. Функция, которую вы передаете, это f, функция foldRight вызывает ее с двумя аргументами.
Bergi 09.04.2019 09:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
1
131
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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)...)) where x1, ..., 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.

Другие вопросы по теме