首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >fold和foldLeft还是foldRight之间的区别?

fold和foldLeft还是foldRight之间的区别?
EN

Stack Overflow用户
提问于 2011-06-06 22:58:55
回答 7查看 27K关注 0票数 66

注意:我使用的是Scala2.8--这有问题吗?

为什么我不能像使用foldLeftfoldRight一样使用fold函数

Set scaladoc中,它说:

折叠的结果只能是此并行集合的类型参数T的超类型。

但我在函数签名中看不到类型参数T

def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1

foldLeft-Rightfold有什么区别,如何使用后者?

编辑:例如,我如何编写一个文件夹来添加列表中的所有元素?对于foldLeft,它将是:

val foo = List(1, 2, 3)
foo.foldLeft(0)(_ + _)

// now try fold:
foo.fold(0)(_ + _)
>:7: error: value fold is not a member of List[Int]
  foo.fold(0)(_ + _)
    ^
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-06-09 05:34:37

您说得对,旧版本的Scala是个问题。如果您查看Scala2.8.1的scaladoc page,您将看到没有定义任何文件夹(这与您的错误消息一致)。显然,fold是在Scala2.9中引入的。

票数 11
EN

Stack Overflow用户

发布于 2011-06-07 00:28:15

简短的回答:

右边是foldRight associates。即元素将按从右到左的顺序累积:

List(a,b,c).foldRight(z)(f) = f(a, f(b, f(c, z)))

foldLeft关联在左侧。即,一个累加器将被初始化,元素将按从左到右的顺序添加到累加器:

List(a,b,c).foldLeft(z)(f) = f(f(f(z, a), b), c)

fold是关联的,因为没有定义元素添加到一起的顺序。也就是说,fold的参数形成一个。

票数 76
EN

Stack Overflow用户

发布于 2011-06-06 23:11:40

foldRightfoldLeft相反,fold不提供任何关于集合元素的处理顺序的保证。您可能希望对并行集合使用具有更多约束签名的fold,其中缺乏有保证的处理顺序有助于并行集合以并行方式实现折叠。更改签名的原因是相似的:有了额外的约束,更容易进行并行折叠。

票数 57
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6253978

复制
相关文章

相似问题

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