scala类型推断与_占位符

时间:2010-08-16 12:37:42

标签: scala type-inference placeholder

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

编译好,但

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

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

编辑:我的意思是打印不打印 - 不是说它有逻辑差异。

2 个答案:

答案 0 :(得分: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本身的类型参数。由于我们有List[String],编译器知道必须传递给foreach Function[String, B]

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

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

def print (x: Any) : Unit

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

答案 1 :(得分:6)

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

您希望它做的是注意println无法正常工作并向后递归并再次尝试foreach。但它不能这样做:println可以接受任何参数,包括函数,因此x => x+" "println尝试打印的完全有效的东西。

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