此代码摘自《 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]
函数中的a
和b
是什么? scala如何将参数与exists
答案 0 :(得分:2)
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的连续元素之间插入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
由于您拥有A
(sealed trait Stream[+A]
)类型的Stream,a
只能是Stream的元素之一。
b
就是您要在其上累积结果的值。在exists
中,它检查谓词p
的一个元素是否为真。