Понимание scanRight в Scala - PullRequest
       0

Понимание scanRight в Scala

0 голосов
/ 08 января 2019

У меня проблемы с пониманием следующей реализации функции scanRight в Scala.

def scanRight[B](z: B)(f: (A, => B) => B): Stream[B] =
    foldRight((z, Stream(z)))((a, p0) => {
      lazy val p1 = p0
      val b2 = f(a, p1._1)
      (b2, cons(b2, p1._2))
    })._2

Типичное применение scanRight будет Stream(1, 2, 3).scanRight(0)(_ + _).toList

, который производит знакомый List(1+2+3, 1+2, 1, 0).

В частности, я не понимаю, что p0 здесь. Кажется, это кортеж? Но откуда этот кортеж?

Обратите внимание, что эта конкретная реализация взята из здесь

Спасибо и, пожалуйста, дайте мне знать, если вам понадобится дополнительная информация.

1 Ответ

0 голосов
/ 08 января 2019

Кортеж является аргументом для вызова foldRight: (z, Stream(z)). Первое значение в кортеже пока является результатом сканирования. Второе значение - Stream, которое будет конечным результатом вызова scanRight.

Каждый проход fold обновляет результат сканирования, вызывая f для текущего значения в последовательности (a) и предыдущего значения сканирования (первый элемент в кортеже). Результат добавляется в поток (во второй элемент кортежа) с помощью cons. Оба значения передаются на следующую итерацию fold как новый кортеж.

Когда fold заканчивается, он возвращает кортеж, но scanRight требует только второй элемент, поэтому извлекается из этого кортежа (._2) и возвращается.

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