模式匹配如何在存在功能中起作用?

时间:2019-04-09 07:36:47

标签: scala functional-programming

此代码摘自《 scala中的功能编程》一书

searchAutocomplete(e) {
  this.inputValue = e
  // rest of the code
}

我不了解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] 函数中的ab是什么? scala如何将参数与exists

匹配

2 个答案:

答案 0 :(得分:2)

foldRightfoldLeft对集合(在您的示例中为流)进行操作,接收两个参数(基值)和一个函数。该函数还接收两个参数,一个累加器和一个元素,它们在每次迭代中进行处理

累加器位于折叠的一侧(即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的连续元素之间插入op的结果   此序列,从右到左,起始值为z   正确:

     

op(x_1, op(x_2, ... op(x_n, z)...))其中x1, ..., xn是元素   这个顺序。如果此序列为空,则返回z。

您可以检查整个API here

答案 1 :(得分:1)

始终检查出色的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

  • 由于您拥有Asealed trait Stream[+A])类型的Stream,a只能是Stream的元素之一。

  • b就是您要在其上累积结果的值。在exists中,它检查谓词p的一个元素是否为真。