List("This","is","Scala").foreach(a => print(a+" "))
编译得很好,但是
List("This","is","Scala").foreach(print(_+" "))
未能抱怨缺少参数类型。我无法弄清楚为什么它会失败。
编辑:我的意思是 print 不是 println - 并不是说它在逻辑上有所不同。
List("This","is","Scala").foreach(a => print(a+" "))
编译得很好,但是
List("This","is","Scala").foreach(print(_+" "))
未能抱怨缺少参数类型。我无法弄清楚为什么它会失败。
编辑:我的意思是 print 不是 println - 并不是说它在逻辑上有所不同。
问题是这
List("This","is","Scala").foreach(print(_+" "))
不等于
List("This","is","Scala").foreach(a => print(a+" "))
但要
List("This","is","Scala").foreach(print(a => a+" "))
现在,让我们看看 的类型签名foreach
:
def foreach [B] (f: (A) ⇒ B) : Unit
其中A
是List
自身的类型参数。由于我们有 a List[String]
,编译器知道必须传递给foreach
a Function[String, B]
。
那么在a => print(a+" ")
类型中a
是已知的:String
。
print(a => a+" ")
里面有问题,因为print
不是Function
。但是,编译器还没有考虑到这一点——它仍在尝试编译a => a+" "
. 那么让我们看看类型Predef.print
:
def print (x: Any) : Unit
所以a => a+" "
must 是 type Any
,当然,这意味着它可以是任何东西。它无助于编译器断言类型a
是什么。这并不重要,因为您不想首先打印 a Function
。
Scala 读(_+" ")
作x => x+" "
. 但println
不包含任何类型信息来帮助编译器猜测x
可能是什么类型,所以它给出了那个错误。
你想要它做的是注意到它println
不起作用并向后递归并再次尝试foreach
. 但它不能这样做:println
可以接受任何参数,包括函数,因此尝试打印x => x+" "
是完全有效的。println
(即使在理论上它可以回溯的情况下,它通常也不会。)