无法输入有问题的下划线。但代码段有下划线。
为什么list.map( +2)代替list.map(x => x + 2),但list.map()不能代替list.map(x) => X)
scala> val list = List(1,2,3,4)
list: List[Int] = List(1, 2, 3, 4)
scala> list.map(_+2)
res14: List[Int] = List(3, 4, 5, 6)
scala> list.map(x=>x+2)
res15: List[Int] = List(3, 4, 5, 6)
scala> list.map(x=>x)
res16: List[Int] = List(1, 2, 3, 4)
scala> list.map(_)
<console>:13: error: missing parameter type for expanded function ((x$1) => list.map(x$1))
list.map(_)
^
scala>
答案 0 :(得分:2)
为此,您需要使用identity
功能。这是因为在这种情况下,占位符_
使您的表达式list.map(_)
成为部分应用的函数。如果将它分配给val,可能会更清楚:
val fun: (Int => Int) => List[Int] = list.map(_)
然后你就可以像val fun
这样使用:
fun(_ * 2) // returns List(2, 4, 6, 8)
如果要映射到相同的值,可以使用identity
:
list.map(identity) // returns List(1, 2, 3, 4)
答案 1 :(得分:2)
这很简单。如果_
被视为匿名函数的有效表达式并转换为x => x
,则_ * 2
将转换为(x => x) * 2
,这会使占位符无效。相反,Scala试图从_
找到第一个完整的表达式“向外”。如果list.map(_)
为list.map(_)
,那么您有x => list.map(x)
。
更有趣的例子:
_ + (2 * _) //> x => x + (y => 2 * y)
_ + 2 * _ //> (x, y) => x + 2 * y
(括号“完整”表达式)
答案 2 :(得分:0)
您所描述的_
是placeholder syntax for anonymous函数,代表函数的参数。
E.g:
list.map(_+2) // map takes a function which takes one argument and returns that arg + 2
由于map将函数作为参数而不是占位符,因此您就会看到此问题。