7
List("This","is","Scala").foreach(a => print(a+" "))

编译得很好,但是

List("This","is","Scala").foreach(print(_+" "))

未能抱怨缺少参数类型。我无法弄清楚为什么它会失败。

编辑:我的意思是 print 不是 println - 并不是说​​它在逻辑上有所不同。

4

2 回答 2

7

问题是这

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

其中AList自身的类型参数。由于我们有 a 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

所以a => a+" "must 是 type Any,当然,这意味着它可以是任何东西。它无助于编译器断言类型a是什么。这并不重要,因为您不想首先打印 a Function

于 2010-08-16T16:31:10.037 回答
6

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

你想要它做的是注意到它println不起作用并向后递归并再次尝试foreach. 但它不能这样做:println可以接受任何参数,包括函数,因此尝试打印x => x+" "是完全有效的。println

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

于 2010-08-16T12:54:44.627 回答