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)
没有抱怨缺少参数类型.我无法弄清楚它失败的原因.
编辑:我的意思是打印不打印 - 不是说它有逻辑上的区别.
问题是这个
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)
A其List本身的类型参数在哪里.由于我们有一个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在第一时间打印.
Scala读(_+" ")作x => x+" ".但是println不包含任何类型信息来帮助编译器猜测x可能是什么类型,因此它会给出错误.
你想要它做的是通知println不起作用并向后递归并再次尝试foreach.但它无法做到这一点:println可以采取任何参数,包括函数,因此尝试打印x => x+" "是完全有效的println.
(即使在理论上可以回溯的情况下,它通常也不会.)