使用foldl
查看代码时,很难理解其语法,例如:
def lstToMap(lst:List[(String,Int)], map: Map[String, Int] ):Map[String, Int] = {
(map /: lst) (addToMap)
}
是/:
中缀运算符吗? (map /: lst)
是什么意思,部分申请?为什么我不能这样打电话:
`/: map lst addToMap`
答案 0 :(得分:5)
以:
字符结尾的方法名称可以在它们绑定的实例的左侧使用(即,它们与右侧相关联)。在这种情况下,/:
是method on List
。根据Scaladoc:
注意:/:是foldLeft的替代语法; z /:xs与xs foldLeft z相同。
您所写的内容的替代方案是:
lst./:(map)(addToMap)
编辑:以及另一种使用foldLeft的替代方法:
lst.foldLeft(map)(addToMap)
答案 1 :(得分:2)
是的,/:
可以用作中缀运算符。但是, fold 操作需要三个参数:
使用中缀,您只能指定这三个参数中的两个:序列(接收者)和初始值。 (map /: lst)
是部分应用程序的事实反映了您仍然缺少参数的事实。以下是一系列数字乘积的示例,从初始值1开始:
(1 /: xs)(_*_)
由于Scala支持函数文字的花括号,您也可以使用它来使函数参数看起来更像函数体:
(1 /: xs) { (x, y) =>
x * y
}