在给出实际答案之前,这里有几件事要提:
- 您的问题与
left 无关,而是关于减少和折叠之间的区别
- 区别根本不在于实现,只看签名。
- 这个问题与 Scala 没有任何关系,而是与函数式编程的两个概念有关。
回到你的问题:
这是foldLeft 的签名(也可以是foldRight,因为我要说明这一点):
def foldLeft [B] (z: B)(f: (B, A) => B): B
这里是reduceLeft 的签名(同样,这里的方向无关紧要)
def reduceLeft [B >: A] (f: (B, A) => B): B
这两个看起来非常相似,因此引起了混乱。 reduceLeft 是 foldLeft 的一个特例(顺便说一下,这意味着您有时可以使用它们中的任何一个来表达相同的东西)。
当你调用reduceLeft 时说List[Int],它实际上会将整个整数列表缩减为单个值,该值将是Int 类型(或Int 的超类型,因此@ 987654334@).
当您在List[Int] 上调用foldLeft 时,它会将整个列表(想象一下滚动一张纸)折叠成一个值,但这个值甚至不必与Int 相关(因此[B])。
这是一个例子:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
此方法接受List[Int] 并返回Tuple2[List[Int], Int] 或(List[Int], Int)。它计算总和并返回一个带有整数列表的元组,它是总和。顺便说一下,列表是向后返回的,因为我们使用了foldLeft 而不是foldRight。
观看One Fold to rule them all 以获得更深入的解释。