Scala - 在地图函数中与lambda混淆

oks*_*s16 2 lambda scala

我正在学习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))
Run Code Online (Sandbox Code Playgroud)

谢谢.

Mar*_*rth 6

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)
Run Code Online (Sandbox Code Playgroud)

在这种情况下(1),scala可以推断出x有类型Int(自list: List[Int]).
然而(2)失败了

error: missing parameter type for expanded function ((x$1) => x$1.$plus(1))
Run Code Online (Sandbox Code Playgroud)

因为scala无法推断出x类型List(x => x+1).


关于扩展和身份功能:

scala> list.map(List(_))
res3: List[List[Int]] = List(List(1), List(2), List(3), List(4))
Run Code Online (Sandbox Code Playgroud)

工作原理,因为list.map(List(x => x))扩展被拒绝,而下一个可能是list.map(x => List(x)),这给res3.