Scala 运算符结合性(第二个参数列表)

Scala operator associativity (2nd parameter lists)

是否可以直接对采用第二个参数列表(带有隐式 arg)的方法的结果调用应用函数?即使在逻辑位置有括号,我也会得到相同的编译时类型错误,这表明它没有按预期解析它。

val x = Map(1 -> 2, 2->4, 3-> 6) //1

val y = x.map(_.swap) //2

y(4) //3

x.map(_.swap)(4) //4

((x.map(_.swap))(4) //5

第 4 行不解析是有意义的,因为 (4) 很容易看起来是 map() 的第二个参数列表,但是第 5 行,.map 表达式周围有一组 (),但是它仍然将 (4) 关联到 .map 而不是 .map() 的结果。

有没有办法在一个表达式中完成第 2 行和第 3 行?

编辑:我知道 .apply(),这是编译器将自行插入的内容。有没有不用手动脱糖的方法?

是的,有几种可能的解决方案。 所有工作都通过满足隐式参数列表或给编译器提示表达式已经结束并且 (),读取应用,实际上是应用方法,没有第二个参数列表。

1。调用 .apply()

scala> Map(1 -> 2, 2 -> 4, 3 -> 6).map(_.swap).apply(4)
res7: Int = 2

2。直接提供隐式

另一种选择是直接提供隐含的

突破示例

import scala.collection.breakOut

scala> List(1).map(_ + 1)(breakOut)(0)
res38: Int = 2

我认为普遍的问题是:您必须填写以提供隐含的 CanBuildFrom 才能正常工作,或者明确声明您要调用应用而不填写第二个参数列表。

您可以在 http://docs.scala-lang.org/tutorials/FAQ/breakout 中找到更多信息。反对 secCanBuildFrom 的名称。