fold和foldLeft或foldRight之间的区别?

And*_*yuk 63 scala fold

注意:我在使用Scala 2.8-can这是一个问题?

为什么我不能使用fold功能的方式相同foldLeftfoldRight

Set scaladoc中它说:

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

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

def fold [A1 >: A] (z: A1)(op: (A1, A1) ? A1): A1
Run Code Online (Sandbox Code Playgroud)

foldLeft-Right和之间的区别是什么fold,以及如何使用后者?

编辑:例如,如何编写折叠以添加列表中的所有元素?有了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)(_ + _)
    ^
Run Code Online (Sandbox Code Playgroud)

Apo*_*isp 68

简短回答:

foldRight联想到右边.即元素将按从右到左的顺序累积:

List(a,b,c).foldRight(z)(f) = f(a, f(b, f(c, z)))
Run Code Online (Sandbox Code Playgroud)

foldLeft联系到左边.即初始化累加器,元素将按从左到右的顺序添加到累加器:

List(a,b,c).foldLeft(z)(f) = f(f(f(z, a), b), c)
Run Code Online (Sandbox Code Playgroud)

fold关联的,因为没有定义元素加在一起的顺序.即fold形成幺半群的论据.

  • monoid是一个关联二元函数以及该函数的标识元素.例如,`(0)(_ + _)`是一个幺半群.`(1)(_*_)`是另一个例子.我想你明白它是什么,只是不是那个名字. (4认同)
  • 雷克斯:交换性在这里并不重要. (2认同)
  • 没有眼泪的幺半群:http://fsharpforfunandprofit.com/posts/monoids-without-tears/ (2认同)

Jea*_*let 54

fold相反,foldRight并且foldLeft,不提供有关该集合的元素将被处理的顺序任何保证.您可能希望使用fold具有更多约束签名的并行集合,其中缺少有保证的处理顺序有助于并行集合以并行方式实现折叠.更改签名的原因类似:使用其他约束,更容易进行并行折叠.


exl*_*van 8

你对旧版Scala是个问题你是对的.如果您查看Scala 2.8.1 的scaladoc页面,您将看到没有定义折叠(这与您的错误消息一致).显然,fold是在Scala 2.9中引入的.