什么决定了foldLeft中的'A'类型?

问题描述 投票:2回答:2

在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 {

这就是为什么类型AfoldLeft中输入Int?

scala
2个回答
5
投票

foldLeft[B]List[A](以及许多不同的收藏类型)的成员。所以A只是你要折叠的集合的类型参数。

List(1, 2)List[Int],所以A = Int

然后B就是你要折叠的类型(fold的返回类型)。它可能与A相同,但它可能没有。在你的例子中,你折叠成List[Int],所以B = List[Int](不是Int)。


3
投票

简而言之

List(1, 2, 3).foldLeft(List[Int]())((b, a) => a :: b)
     ^                 ^
     A                 B
© www.soinside.com 2019 - 2024. All rights reserved.