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)))
您希望 _
的两个实例都被视为相同的参数,这不是 _
的工作方式。表达式中每次出现的 _
始终被视为唯一参数。
我玩了一下占位符,发现了一个奇怪的情况:
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)))
您希望 _
的两个实例都被视为相同的参数,这不是 _
的工作方式。表达式中每次出现的 _
始终被视为唯一参数。