如何在Scala中实现foldLeft运算符?

时间:2016-06-21 21:55:34

标签: scala

为什么foldLeft语法运算符有效,例如我期望这段代码

  

(10 / :( 1到5))(_ + _)

给我一​​个错误"值/:不是Int"的成员。它如何在类型系统中的所有类型上扩展方法/:?

2 个答案:

答案 0 :(得分:3)

以下是"快捷方式的定义"操作者:

def /:[B](z: B)(op: (B, A) => B): B = foldLeft(z)(op)

如果操作符以冒号结尾,则它是右关联的。 1 :: Nil是另一个示例,::

上没有方法Int

这一切都有效:

  • (1 to 5)./:(10)(_ + _)
  • ((1 to 5) foldLeft 10)(_ + _)(几乎和你的例子相同, 但是在这里,更明显的是,foldLeft实际上是一种方法 范围对象)
  • (1 to 5).foldLeft(10)(_ + _)

答案 1 :(得分:0)

您的问题并不完全清楚(表达式中没有提到n),但是:以冒号结尾的运算符被解释为右侧参数的方法,而不是左侧的方法。你的表达相当于

(1 to 5)./:(10)(_ + _)

其中/:更清晰地被视为左侧Range对象的方法。