List("This","is","Scala").foreach(a => print(a+" "))
編譯罰款,但與_佔位Scala的類型推斷
List("This","is","Scala").foreach(print(_+" "))
失敗抱怨缺少的參數類型。我無法弄清楚它爲什麼失敗。
編輯:我的意思是打印不println - 不是它使邏輯的區別。
List("This","is","Scala").foreach(a => print(a+" "))
編譯罰款,但與_佔位Scala的類型推斷
List("This","is","Scala").foreach(print(_+" "))
失敗抱怨缺少的參數類型。我無法弄清楚它爲什麼失敗。
編輯:我的意思是打印不println - 不是它使邏輯的區別。
的問題是,這
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
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
。
斯卡拉讀取(_+" ")
作爲x => x+" "
。但是println
不包含任何類型的信息來幫助編譯器猜測x
可能是什麼類型,所以它會給出這個錯誤。
你想要它做的是注意println
沒有工作和遞減,並嘗試再次爲foreach
。但它不能這樣做:println
可以採取任何參數,包括一個函數,所以x => x+" "
是println
嘗試打印完全有效的東西。
(甚至在它在理論上可以原路返回的情況下,一般不會。)
有關更詳細的答案,請參見http://stackoverflow.com/questions/2173373/scala-foreach-strange-behaviour/2176548#2176548。 – huynhjl 2010-08-16 14:58:11