scala类型推断与_占位符

Dav*_*Sol 7 scala type-inference placeholder

List("This","is","Scala").foreach(a => print(a+" "))
Run Code Online (Sandbox Code Playgroud)

编译好,但是

List("This","is","Scala").foreach(print(_+" "))
Run Code Online (Sandbox Code Playgroud)

没有抱怨缺少参数类型.我无法弄清楚它失败的原因.

编辑:我的意思是打印不打印 - 不是说它有逻辑上的区别.

Dan*_*ral 7

问题是这个

List("This","is","Scala").foreach(print(_+" "))
Run Code Online (Sandbox Code Playgroud)

不等于

List("This","is","Scala").foreach(a => print(a+" "))
Run Code Online (Sandbox Code Playgroud)

但是

List("This","is","Scala").foreach(print(a => a+" "))
Run Code Online (Sandbox Code Playgroud)

现在,让我们看看类型签名foreach:

def foreach [B] (f: (A) ? B) : Unit
Run Code Online (Sandbox Code Playgroud)

AList本身的类型参数在哪里.由于我们有一个List[String],编译器知道必须传递给foreacha Function[String, B].

在已知a => print(a+" ")的类型中a:String.

print(a => a+" ")有一个问题,print是不是Function.但是,编译器还没有考虑过 - 它仍在尝试编译a => a+" ".那么让我们来看看它的类型Predef.print:

def print (x: Any) : Unit
Run Code Online (Sandbox Code Playgroud)

所以a => a+" "必须是类型Any,当然,这意味着它可以是任何东西.它无法帮助编译器断言它的类型a.这并不重要,因为你不想Function在第一时间打印.


Rex*_*err 6

Scala读(_+" ")x => x+" ".但是println不包含任何类型信息来帮助编译器猜测x可能是什么类型,因此它会给出错误.

你想要它做的是通知println不起作用并向后递归并再次尝试foreach.但它无法做到这一点:println可以采取任何参数,包括函数,因此尝试打印x => x+" "是完全有效的println.

(即使在理论上可以回溯的情况下,它通常也不会.)