/:
的文档包含
Note: might return different results for different runs, unless the underlying collection type is ordered or the operator
is associative and commutative.
(src)
这只适用于运行此函数的par版本,否则结果是确定性的(与foldLeft相同)?
此功能也是在引擎盖下调用foldLeft:def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)
它们的函数定义相同(函数param标签除外," op"" f"的instad):
def /:[B](z: B)(op: (B, A) ⇒ B): B
def foldLeft[B](z: B)(f: (B, A) ⇒ B): B
由于这些原因,/:
函数有什么意义?何时应该使用它来支持foldLeft?
我的推理不正确吗?
答案 0 :(得分:3)
它只是一种替代语法。结束于:
的方法在右侧手边调用。
而不是
list.foldLeft(0) { op(_, _) }
或
list./:(0) { op(_, _) }
你可以
( z /: list ) { op(_, _) }
例如,
scala> val a = List(1,2,3,4)
a: List[Int] = List(1, 2, 3, 4)
scala> ( 0 /: a ) { _ + _ }
res5: Int = 10
答案 1 :(得分:0)
是的,这些是来自黑暗时代的别名,当时人们喜欢这样的运营商:
val x = y |@<@|: z
。
注意事项的目的是提醒对于具有未指定迭代顺序的集合,fold
的结果可能不同。考虑让Set {1,2,3}
即使未经修改也不保证相同的访问顺序,并应用不是e的操作。 G。关联的(如/
)。即使在par
调用之后运行,也可能导致以下(伪代码):
{1,2,3} foldLeft / ==> (1 / 2) / 3 ==> 1/6 = 0.1(6)
{3,1,2} foldLeft / ==> (3 / 1) / 2 ==> 3/2 = 1.5
就一致性而言,这类似于将不可并行化的操作应用于并行集合。