需要明确仅在scala中使用单个下划线

时间:2016-11-17 22:11:22

标签: scala

无法输入有问题的下划线。但代码段有下划线。

为什么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>

3 个答案:

答案 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将函数作为参数而不是占位符,因此您就会看到此问题。