阅读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)
}
答案 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;真正的"代码,它是为了展示所有部分和类型如何适合示例。