了解foldLeft函数 - 如何输入参数值?

时间:2014-07-28 22:26:00

标签: scala

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

f对应于foldLeft签名中的(List[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)

}

2 个答案:

答案 0 :(得分:3)

API使这有点不清楚。我通常看待它的方式是:

foldLeft(累加器)((累加器,elem)=> someOperation)

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

例如:

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

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

将返回21,然后您可以在某个变量中捕获。

希望这有帮助。

答案 1 :(得分:0)

z是"零值"对于B型。

一个可能使这一点更清晰的例子。我想计算一个字符串列表中以字符串" cat"

开头的项目数
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)

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

注意:显然没有人会打破这样的所有作品#34;真正的"代码,它是为了展示所有部分和类型如何适合示例。