在foldLeft的定义中,Ints列表被反转:
val l = List(1, 2) //> l : List[Int] = List(1, 2)
l.foldLeft(List[Int]())((b, a) => a :: b) //> res2: List[Int] = List(2, 1)
A
如何在foldLeft函数中输入到Int?
foldLeft的来源是:
def foldLeft[B](z: B)(f: (B, A) => B): B = {
var acc = z
var these = this
while (!these.isEmpty) {
acc = f(acc, these.head)
these = these.tail
}
acc
}
是什么决定了A
类型?是否有一些Scala隐含逻辑从类型参数Int
确定List[Int]
类型?
更新:
foldLeft在LinearSeqOptimized中定义。
当使用val l = List(1,2)
创建列表时,这也会将A
参数键入LinearSeqOptimized
,因为它是对象层次结构的一部分:
sealed abstract class List[+A] extends AbstractSeq[A]
with LinearSeq[A]
with Product
with GenericTraversableTemplate[A, List]
with LinearSeqOptimized[A, List[A]]
with Serializable {
这就是为什么类型A
在foldLeft
中输入Int?
foldLeft[B]
是List[A]
(以及许多不同的收藏类型)的成员。所以A
只是你要折叠的集合的类型参数。
List(1, 2)
是List[Int]
,所以A = Int
。
然后B
就是你要折叠的类型(fold
的返回类型)。它可能与A
相同,但它可能没有。在你的例子中,你折叠成List[Int]
,所以B = List[Int]
(不是Int
)。
简而言之
List(1, 2, 3).foldLeft(List[Int]())((b, a) => a :: b)
^ ^
A B