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

编译好,但是

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

失败的抱怨缺少的参数类型。我想不出为什么它失败。

编辑:我的意思打印未释放-不,它使得合乎逻辑的差异。

有帮助吗?

解决方案

问题是这个

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 在第一位。

其他提示

斯卡拉读 (_+" ") 作为 x => x+" ".但 println 不包含任何类型的信息,以帮助编译器猜猜是什么类型的 x 可能,所以它提供了这一错误。

你想要什么它要做的就是注意到 println 没有工作和recurse后再试一次为 foreach.但它不能这样做: println 可以采取任何论据,包括一个功能,所以 x => x+" " 是一个完全有效的事情 println 试试打印。

(甚至在一个情况下它可能在理论上走回头路,它一般不会.)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top