Scala 了解foldLeft函数-参数值是如何键入的?

Scala 了解foldLeft函数-参数值是如何键入的?,scala,Scala,阅读foldLeft的签名:def foldLeft[B](z:B)(f:(B,A)=>B):B={ 在下面的实现中似乎没有使用z类型 f对应于foldLeft签名中的(列表[Int](),0) object foldleftfun { println("Welcome to the Scala worksheet") //> Welcome to the Scala worksheet val numbers = List(1, 2, 3)

阅读foldLeft的签名:
def foldLeft[B](z:B)(f:(B,A)=>B):B={
在下面的实现中似乎没有使用z类型

f对应于foldLeft签名中的
(列表[Int](),0)

object foldleftfun {
  println("Welcome to the Scala worksheet")       //> Welcome to the Scala worksheet

  val numbers = List(1, 2, 3)                     //> numbers  : List[Int] = List(1, 2, 3)

  numbers.foldLeft((List[Int](), 0)) {
    (resultingTuple, currentInteger) => {

            println(resultingTuple)
            println(currentInteger)
            println("")

        (currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
      }
  }                                               //> (List(),0)
                                                  //| 1
                                                  //| 
                                                  //| (List(1),1)
                                                  //| 2
                                                  //| 
                                                  //| (List(2, 1),3)
                                                  //| 3
                                                  //| 
                                                  //| res0: (List[Int], Int) = (List(3, 2, 1),6)

}
z是类型B的“零值”

这是一个可以让这一点更清楚的示例。我想计算以字符串“cat”开头的字符串列表中的项目数

在这个例子中,第一个单词需要有一个相应的计数,如果没有z值0,我们就不一定知道从哪里开始


注意:显然,没有人会像这样对“真实”代码进行分解,这样做是为了展示所有的片段和类型如何适合示例。

API使这一点有点不清楚。我通常的看法是:

foldLeft(蓄能器)((蓄能器,元件)=>someOperation)

第一个累加器就是您想要的任何起始值。此foldLeft的返回类型将是您为累加器提供的任何值的类型。foldLeft迭代您调用它的列表的元素,以便该列表的每个元素都成为foldLeft中的elem值。第二组圆括号中的累加器每次迭代后更新

例如:

val ls=列表(1,2,3,4,5,6)

ls.foldLeft(0)((acc,elem)=>acc+elem)

将返回21,然后可以将其捕获到某个变量中


希望这有帮助。

在您的情况下,
z
(List[Int](),0)
。它是起始值。您在大括号中定义了
f
type A = String
type B = Int
val m: List[A] = List("cat", "catatonic", "dog", "catamaran")
val z: B = 0
val f: (B, A) => B = {(count, word) =>
  if(word.startsWith("cat"))
    count + 1
  else
    count
}

m.foldLeft(z)(f)