我正在学习 Scala 并在命令行中进行试验。我无法理解为什么第二行无法编译。有人可以解释一下吗。
val list = List(1,2,3,4)
list.map(_+1) //This works. List(2,3,4,5)
list.map(List(_+1)) //But, Compilation Fails here
list.map(x=>List(x+1)) //This works. List(List(2),List(3),List(4),List(5))
谢谢。
最佳答案
Scala 会将 _
(在占位符位置使用时)扩展为 x => x
,除非这种扩展会导致恒等函数(更多信息请参见这个答案的结尾):
list.map(_+1) // same as list.map(x => x + 1) (1)
list.map(List(_+1)) // same as list.map(List(x => x+1)) (2)
在 (1)
的情况下,scala 可以推断出 x
的类型为 Int
(因为 list: List[Int ]
).
但是 (2)
失败了
error: missing parameter type for expanded function ((x$1) => x$1.$plus(1))
因为 scala 无法推断 x
在 List(x => x+1)
中的类型。
关于扩展和恒等函数:
scala> list.map(List(_))
res3: List[List[Int]] = List(List(1), List(2), List(3), List(4))
有效,因为 list.map(List(x => x))
扩展被拒绝,下一个可能的是 list.map(x => List(x) )
,它给出 res3
。
https://stackoverflow.com/questions/38615221/