Scala:是运算符foldl中缀吗?

时间:2013-03-24 22:12:55

标签: scala fold

使用foldl查看代码时,很难理解其语法,例如:

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

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

`/:  map lst addToMap`

2 个答案:

答案 0 :(得分:5)

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

  

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

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

lst./:(map)(addToMap)

编辑:以及另一种使用foldLeft的替代方法:

lst.foldLeft(map)(addToMap)

答案 1 :(得分:2)

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

  1. 折叠的序列
  2. 减少的初始值
  3. 用于折叠的功能
  4. 使用中缀,您只能指定这三个参数中的两个:序列(接收者)和初始值。 (map /: lst)是部分应用程序的事实反映了您仍然缺少参数的事实。以下是一系列数字乘积的示例,从初始值1开始:

    (1 /: xs)(_*_)
    

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

    (1 /: xs) { (x, y) =>
        x * y
    }