2010-08-16 91 views
7
List("This","is","Scala").foreach(a => print(a+" ")) 

編譯罰款,但與_佔位Scala的類型推斷

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

失敗抱怨缺少的參數類型。我無法弄清楚它爲什麼失敗。

編輯:我的意思是打印不println - 不是它使邏輯的區別。

+2

有關更詳細的答案,請參見http://stackoverflow.com/questions/2173373/scala-foreach-strange-behaviour/2176548#2176548。 – huynhjl 2010-08-16 14:58:11

回答

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 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+" "必須Any型,其中,當然,意味着它可以是任何東西的。它不會幫助編譯器聲明a的類型。這並不重要,因爲您不希望首先打印Function

6

斯卡拉讀取(_+" ")作爲x => x+" "。但是println不包含任何類型的信息來幫助編譯器猜測x可能是什麼類型,所以它會給出這個錯誤。

你想要它做的是注意println沒有工作和遞減,並嘗試再次爲foreach。但它不能這樣做:println可以採取任何參數,包括一個函數,所以x => x+" "println嘗試打印完全有效的東西。

(甚至在它在理論上可以原路返回的情況下,一般不會。)