2012-05-29 34 views
0

我試着用壓縮方法的元組瀏覽臨時壓縮列表使用修真2參數的地圖功能

給它是類似的東西:

val l1 : List[Int] = List(1,2,3) 
val l2 : List[Int] = List(2,3,1) 
val l3 : List[Int] = for ((a,b) <- (l1,l2).zipped) yield a+b 

這是一種合成的例子並可能被替換爲只是地​​圖功能,但我想用它更復雜的表達式。

它給我錯誤:錯誤的參數數量;預期= 2這是有道理的,因爲(l1,l2).zipped.map有兩個參數。爲了理解,翻譯雙參數地圖函數的正確方法是什麼?

回答

1

你不能因爲for只是

(l1,l2).zipped.map{ _ match { case (a,b) => a+b } } 

zipped的地圖需要兩個參數,而不是一個壓縮版本翻譯成for聲明。因爲不知道有兩個參數的地圖,但它確實知道如何進行匹配。元組是正是你需要兩個參數轉換成一個什麼和郵政編碼,將創建它們:

for ((a,b) <- (l1 zip l2)) yield a+b 

創造一個額外的對象每次迭代的成本。在很多情況下,這並不重要。當它的時候,你最好把它寫滿。實際上,你可能更好的是使用Array,至少如果基元功能很強大,那麼你可以避免裝箱,並且避開索引。

1
scala> val l1 : List[Int] = List(1,2,3) 
l1: List[Int] = List(1, 2, 3) 

scala> val l2 : List[Int] = List(2,3,1) 
l2: List[Int] = List(2, 3, 1) 

scala> val l3 : List[Int] = for ((a,b) <- (l1,l2).zip) yield a+b  
l3: List[Int] = List(3, 5, 4) 
+0

它有記憶效率嗎? – ayvango

+0

或'l1 zip l2'。 –

+0

我認爲壓縮函數更有效率,它不會創建臨時集合。 – 0xAX