2017-07-14 24 views
2

您可以使用collection.Map作爲fold的累加器/返回值嗎?在foldleft中使用collection.Map

例如:

Seq(1, 2, 3).foldLeft(collection.Map.empty[Int, Int]) { 
    case (map, i) => map.asInstanceOf[collection.Map[Int, Int]] + (i -> i) 
} 

斯卡拉給了我以下類型的錯誤:

found : scala.collection.Map[Int,Int] 
required: scala.collection.immutable.Map[Int,Int] 
       Seq(1, 2, 3).foldLeft(collection.Map.empty[Int, Int]) { case (map, i) => map.asInstanceOf[collection.Map[Int, Int]] + (i -> i) } 

爲什麼強制使用的collection.immutable.Map代替collection.Map

編輯:毫無意義的鑄造是有點誤導,所以我想讓我的意圖更清晰。我特別使用collection.Map,因爲它是immutable.Mapmutable.Map的超類。在現實中,我使用的返回collection.Map褶皺的內部函數,可以考慮:

scala> def func(map: collection.Map[Int, Int]): collection.Map[Int, Int] = map 
func: (map: scala.collection.Map[Int,Int])scala.collection.Map[Int,Int] 

scala> Seq(1, 2, 3).foldLeft(collection.Map.empty[Int, Int])((map, i) => map + (i -> i)) 
res11: scala.collection.immutable.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3) 

scala> Seq(1, 2, 3).foldLeft(collection.Map.empty[Int, Int])((map, i) => func(map) + (i -> i)) 
<console>:9: error: type mismatch; 
found : scala.collection.Map[Int,Int] 
required: scala.collection.immutable.Map[Int,Int] 
       Seq(1, 2, 3).foldLeft(collection.Map.empty[Int, Int])((map, i) => func(map) + (i -> i)) 
                         ^

下面給出的答案不工作:起始值改變從collection.Map.empty[Int, Int]collection.Map[Int, Int]()。我不知道爲什麼,這使得一個區別:

scala> Seq(1, 2, 3).foldLeft(collection.Map[Int, Int]())((map, i) => func(map) + (i -> i)) 
res13: scala.collection.Map[Int,Int] = Map(1 -> 1, 2 -> 2, 3 -> 3) 

回答

1

Edit

的方法empty返回此:

def empty[A, B]: immutable.Map[A, B] = immutable.Map.empty 

這就是爲什麼你有錯誤類型,因此,與()創建對象,WIL升回給你正確的類型,collection.Map[Int, Int]

def func(map: collection.Map[Int, Int]): collection.Map[Int, Int] = map 

Seq(1, 2, 3).foldLeft(collection.Map[Int, Int]())((res, i) => 
    res + (i -> i) 
) 

Map(1 -> 1, 2 -> 2, 3 -> 3)

+0

這實際上並不奏效,演員角色對於說明我正在使用collection.Map內的關鍵內容至關重要,因此我會更新問題以使其更加清晰。 – jkoenig

+0

@jkoenig這很奇怪,它對我來說就像這樣完美... –

+0

它作爲書面作品,但它不能與collection.Map這是我真正想要的工作,檢查我的意思是一個例子的編輯。感謝您的回答,我的道歉不會使我的意圖更加明顯。 – jkoenig

3

你沒有投它,因爲你已經定義的類型:

Seq(1, 2, 3).foldLeft(collection.Map[Int, Int]()) { 
    case (map, i) => map + (i -> i) 
} 
+0

演員只是爲了迫使編譯器使用collection.Map而不是immutable.Map。奇怪的是,從'collection.Map.empty [Int,Int]'改變爲'collection.Map [Int,Int]()'雖然可以工作 – jkoenig

+0

默認情況下,Scala的集合是不可變的。要訪問可變版本,您需要導入scala.collection.mutable._ – sheunis

+0

我知道他們是,我特別要求關於collection.Map,因爲我想要不可變和可變的Maps的超類。我遺漏了這些信息以使問題簡短明瞭,但我會加上它以使我的意圖更加明顯。 – jkoenig