2

用它看代码foldl很难理解它的语法,例如:

  def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ):Map[String, Int] = {
    (map /: lst) (addToMap)
  }

/:中缀运算符吗?(map /: lst)部分应用是什么意思?为什么我不能这样打电话:

`/:  map lst addToMap`
4

2 回答 2

5

以字符结尾的方法名称:可以用在它们绑定到的实例的左侧(即,它们关联到右侧)。在这种情况下,/:是一个方法List。根据 Scaladoc:

注意:/: 是 foldLeft 的替代语法;z /: xs 与 xs foldLeft z 相同。

您所写内容的替代方法是:

lst./:(map)(addToMap)

编辑:和 foldLeft 的另一种选择:

lst.foldLeft(map)(addToMap)
于 2013-03-25T00:33:39.133 回答
2

是的,/:可以用作中缀运算符。但是,折叠操作需要三个参数:

  1. 要折叠的序列
  2. 减少的初始值
  3. 用于折叠的函数

使用中缀,您只能指定这三个参数中的两个:序列(即接收者)和初始值。作为部分应用程序的事实(map /: lst)反映了您仍然缺少论点的事实。下面是一个数字序列的乘积示例,从初始值 1 开始:

(1 /: xs)(_*_)

由于 Scala 支持函数字面量的花括号,您还可以使用它来使函数参数看起来更像函数体:

(1 /: xs) { (x, y) =>
    x * y
}
于 2013-03-25T03:11:59.343 回答