我玩了一些占位符,发现一个奇怪的情况:

val integers = Seq(1, 2)
val f = (x:Int) => x + 1
integers.map((_, f(_)))


哪个返回

Seq[(Int, Int => Int)] = List((1,<function1>), (2,<function1>))


我期待

Seq[(Int, Int)] = List((1, 2), (2, 3))


如果我进行以下更改,一切都会按预期进行:

integers.map(i => (i, f(i)))


知道为什么在映射过程中未应用功能f的想法吗?

最佳答案

Scala编译器无法理解您的想法,因此_占位符语法仅在非常简单的表达式中有用。

在您的示例中:

integers.map((_, f(_)))


它将f(_)评估为独立的子表达式,因此最终得到的结果与此等效:

x => (x, y => f(y))


即使编译器未将f(_)视为自己的子表达式,其结果也将与您想要的结果不同:

integers.map(i => (i, f(i)))


您希望将_的两个实例都视为同一个参数,这不是_的工作原理。表达式中每次出现的_始终被视为唯一参数。

09-28 07:14