2009-09-23 81 views
2

這裏是POC代碼:不能Scala的理解錯誤類型

object TypeTest extends Application { 
    val stuff = List(1,2,3,4,5) 
    def joined:String = stuff.reduceLeft(_ + ", " + _) 

    println(joined) 
}                        

在編譯時,它提供了以下錯誤:

tt.scala:4: error: type mismatch; 
found : java.lang.String 
required: Int 
    def joined:String = stuff.reduceLeft(_ + ", " + _) 
                ^
tt.scala:4: error: type mismatch; 
found : Int 
required: String 
    def joined:String = stuff.reduceLeft(_ + ", " + _) 
           ^

寫像

reduceLeft(_.toString + ", " + _.toString) 
的加入功能

沒有幫助,還給出了同樣的錯誤。但是,如果我把它寫像

def joined:String = stuff.map(_.toString).reduceLeft(_ + ", " + _) 

一切都很好。

能有人請解釋類型的錯誤,這種怪異的組合?這裏究竟發生了什麼?第二個特別奇怪,因爲Int到String有一個隱式轉換。

回答

9

reduceLeft要求功能塊(括號內)返回相同類型的集合。這是因爲塊被遞歸調用,直到集合的所有值被消耗。

東西是一個列表[INT],但(_ + 「」 + _)是一個字符串,因此類型錯誤。

的類似方法reduceLeft是foldLeft。區別在於集合類型和結果類型可能不同。例如:

stuff.foldLeft("") { _ + ", " + _ } // => java.lang.String = , 1, 2, 3, 4 

我猜你的例子表示,但如果你真的想逗號分隔值的字符串,那麼下面會更好:

stuff.mkString(", ") // => String = 1, 2, 3, 4 
+0

啊,是的,你說得對。我以某種方式將它與摺疊混淆* – 2009-09-23 10:36:00

1

我剛剛開始使用Scala的了。這是我的理解。

'stuff'是一個Int列表,因此'reduceLeft'需要一個Int參數並返回一個Int(基於this)。但是,您將字符串作爲參數(錯誤1)並嘗試將結果分配給字符串(錯誤2)。這就是爲什麼你有這樣的錯誤。

+0

謝謝。我現在明白了。這對我來說真是愚蠢:) – 2009-09-23 10:38:38