Scala:元组内的占位符

Scala : placeholder inside tuple

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

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

哪个returns

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

我期待

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

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

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

知道为什么函数 f 在映射过程中没有应用吗?

下划线仅代表传递的参数一次。所以在 integers.map((_, f(_))) 中,第一个 _ 是来自 integers 的值,但第二个 _ 具有 "partially applied function".

的独立含义

如果您的匿名函数接受 2 个(或更多)参数,那么您可以使用 2 个(或更多)下划线,但每个下划线仅代表其传递的参数一次。

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

在你的例子中:

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

它将 f(_) 计算为一个独立的子表达式,因此您最终得到与此等效的内容:

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

即使编译器不把f(_)当作自己的子表达式,结果也不会和你说的一样:

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

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