Scala 了解foldLeft函数-参数值是如何键入的?
阅读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)
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)