注意:我使用的是Scala2.8--这有问题吗?
为什么我不能像使用foldLeft
或foldRight
一样使用fold
函数
在Set scaladoc中,它说:
折叠的结果只能是此并行集合的类型参数T
的超类型。
但我在函数签名中看不到类型参数T
:
def fold [A1 >: A] (z: A1)(op: (A1, A1) ⇒ A1): A1
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)(_ + _)
^
发布于 2011-06-09 05:34:37
您说得对,旧版本的Scala是个问题。如果您查看Scala2.8.1的scaladoc page,您将看到没有定义任何文件夹(这与您的错误消息一致)。显然,fold
是在Scala2.9中引入的。
发布于 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
的参数形成一个。
发布于 2011-06-06 23:11:40
与foldRight
和foldLeft
相反,fold
不提供任何关于集合元素的处理顺序的保证。您可能希望对并行集合使用具有更多约束签名的fold
,其中缺乏有保证的处理顺序有助于并行集合以并行方式实现折叠。更改签名的原因是相似的:有了额外的约束,更容易进行并行折叠。
https://stackoverflow.com/questions/6253978
复制相似问题