紧接着是foldLeft,B和我不明白它是什么。
我相信它指的是它所操作的任何东西的类型。像金刚的接收器吗?
发布于 2022-03-27 00:05:43
使用foldLeft,我们正在折叠一个可折叠的容器,其中包含A类型的元素,以生成B类型的输出。z是初始值,op是一个函数,它接受B和A类型的两个参数来生成B。如果容器不是空的,则折叠过程从z和容器中的一个元素开始,作为op的输入。这个过程与op的结果以及容器中的下一个元素一起继续,最终产生B类型的结果。如果容器是空的,z (也是B类型的)是foldLeft的结果。
具有不同初始值和操作的列表:
val ls = List(1, 2, 3)
ls.foldLeft(0)((acc, int) => acc + int) //6
ls.foldLeft(2)((acc, int) => acc + int) //8
ls.foldLeft("")((acc, int) => acc + int) //"123"
ls.foldLeft(List.empty[Int])((acc, int) => int :: acc) //List(3, 2, 1)在这里,z的类型和特定情况的结果类型是相同的,但在其他情况下是不同的。在scala中,我们可以使用一个类型参数来表示这个值。在foldLeft的情况下,它使用[B]表示。
def foldLeft[B](z: B)(op: (B, A) => B): B我们本可以写上这样的例子:
ls.foldLeft[Int](0)((acc, int) => acc + int)
ls.foldLeft[Int](2)((acc, int) => acc + int)
ls.foldLeft[String]("")((acc, int) => acc + int)
ls.foldLeft[List[Int]](List.empty[Int])((acc, int) => int :: acc) 但是,由于编译器可以从B的值推断z类型,所以这是不必要的。
发布于 2022-03-28 15:32:03
我喜欢解释foldLeft的方式是,就像这样做:
var result = 0;
for (var i of myCollection) {
result += i;
}
return result[B]是该方法的类型参数,它引用result的类型(在本例中为Int),它与在for-循环之前声明的“初始值”相同。[A]是myCollection中值的类型(var i,在我的示例中也是Int )。
以非常通用的术语考虑这段代码,提供一些初始状态(result = 0),然后在for-循环的每一步中,从集合中获取一个元素,并应用一些逻辑将该元素与当前的“状态”组合,以获得下一个状态。
对于foldLeft,z: B是“初始状态”,op: (A, B) => B是将集合(A)中的元素与当前状态(B)组合起来并返回下一个状态的函数。
所以上面的代码可以重写为
myCollection.foldLeft(0) { (sum, next) => sum + next }或者用方便的缩写来表示匿名函数,
myCollection.foldLeft(0)(_ + _)https://stackoverflow.com/questions/71632636
复制相似问题