什么是/:功能?

时间:2015-05-07 10:52:43

标签: scala

/:的文档包含

  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?   我的推理不正确吗?

2 个答案:

答案 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. {1,2,3} foldLeft / ==> (1 / 2) / 3 ==> 1/6 = 0.1(6)
  2. {3,1,2} foldLeft / ==> (3 / 1) / 2 ==> 3/2 = 1.5
  3. 就一致性而言,这类似于将不可并行化的操作应用于并行集合。