List("This","is","Scala").foreach(a => print(a+" "))
编译好,但
List("This","is","Scala").foreach(print(_+" "))
无法抱怨缺少参数类型。我无法弄清楚它失败的原因。
编辑:我的意思是打印不打印 - 不是说它有逻辑差异。
答案 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
其中A
是List
本身的类型参数。由于我们有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
尝试打印的完全有效的东西。
(即使在理论上可以回溯的情况下,它通常也不会。)