首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"def foldLeft[B](z: B)(op:(B,A)⇒B):B“中的[B]是什么?

"def foldLeft[B](z: B)(op:(B,A)⇒B):B“中的[B]是什么?
EN

Stack Overflow用户
提问于 2022-03-26 23:39:10
回答 2查看 60关注 0票数 0

紧接着是foldLeft,B和我不明白它是什么。

我相信它指的是它所操作的任何东西的类型。像金刚的接收器吗?

EN

回答 2

Stack Overflow用户

发布于 2022-03-27 00:05:43

使用foldLeft,我们正在折叠一个可折叠的容器,其中包含A类型的元素,以生成B类型的输出。z是初始值,op是一个函数,它接受BA类型的两个参数来生成B。如果容器不是空的,则折叠过程从z和容器中的一个元素开始,作为op的输入。这个过程与op的结果以及容器中的下一个元素一起继续,最终产生B类型的结果。如果容器是空的,z (也是B类型的)是foldLeft的结果。

具有不同初始值和操作的列表:

代码语言:javascript
复制
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]表示。

代码语言:javascript
复制
def foldLeft[B](z: B)(op: (B, A) => B): B

我们本可以写上这样的例子:

代码语言:javascript
复制
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类型,所以这是不必要的。

票数 1
EN

Stack Overflow用户

发布于 2022-03-28 15:32:03

我喜欢解释foldLeft的方式是,就像这样做:

代码语言:javascript
复制
var result = 0;
for (var i of myCollection) {
  result += i;
}
return result

[B]是该方法的类型参数,它引用result的类型(在本例中为Int),它与在for-循环之前声明的“初始值”相同。[A]myCollection中值的类型(var i,在我的示例中也是Int )。

以非常通用的术语考虑这段代码,提供一些初始状态(result = 0),然后在for-循环的每一步中,从集合中获取一个元素,并应用一些逻辑将该元素与当前的“状态”组合,以获得下一个状态。

对于foldLeftz: B是“初始状态”,op: (A, B) => B是将集合(A)中的元素与当前状态(B)组合起来并返回下一个状态的函数。

所以上面的代码可以重写为

代码语言:javascript
复制
myCollection.foldLeft(0) { (sum, next) => sum + next }

或者用方便的缩写来表示匿名函数,

代码语言:javascript
复制
myCollection.foldLeft(0)(_ + _)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71632636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档