2017-05-26 46 views
4

我讀斯卡拉地圖文檔,並得到了由這種方法簽名scala - 什麼地圖[(A,B)]是什麼意思?

def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Map[(A, B)] 

困惑是什麼Map[(A, B)]意思?是否與Map[A, B]相同?由於

鏈接到文檔:

http://www.scala-lang.org/api/current/scala/collection/immutable/Map.html

+2

沒有任何意義,這是錯誤的,我不知道爲什麼那件事仍然存在。 –

+0

「仍然」你的意思是這是一個已知的/已經報告的問題? –

+0

其實,我認爲我的問題重複了這個https://stackoverflow.com/q/26132459/842860 – stackoverflower

回答

3

I'm reading the Scala Map doc, and got confused by this method signature

def zipAll[B](that: collection.Iterable[B], thisElem: A, thatElem: B): Map[(A, B)] 

這是方法簽名。這是「use case signature」。它是一個簡化的簽名,表示該方法最常用的用法。所述真正簽名是:

def zipAll[B, A1 >: (K, V), That](that: GenIterable[B], thisElem: A1, thatElem: B)(implicit bf: CanBuildFrom[Map[K, V], (A1, B), That]): That 

What does Map[(A, B)] mean?

(A, B)Tuple2[A, B]語法糖,即一對(又名2-元組)類型。

Is it the same as Map[A, B] ?

沒有,Map[Tuple2[A, B]]是不一樣的Map[A, B]:前者適用的Map類型構造一個參數(A, B)而後者適用的Map類型的構造函數來參數,AB

請注意,Map類型構造函數有兩個參數,所以前者只是一個錯誤:您不能將Map類型構造函數僅應用於一個參數,您需要兩個參數。

請記住,你看到的簽名是唯一一個用例,它是由人類書面人類閱讀,它是不是類型檢查驗證。因此,它可以包含錯誤。

還要注意,整個集合層次結構中有很多重複類型簽名和用例,這些由另外的腳本生成。看起來其中一個腳本只是產生了Map.zipAll的錯誤簽名(請注意,Map上的其他zip變體中也存在相同的錯誤)。

一個小實驗顯示zip將映射的鍵值對作爲結果對的第一個元素和來自that集合的元素作爲結果對的第二個元素,並從中構建映射,這會導致地圖裏面有原鍵值對的鍵和other元素值:

Map("one" → 1, "two" → 2) zip Seq('a, 'b, 'c) 
//=> Map((one, 1) -> 'a, (two, 2) -> 'b) 

因此,簡化使用情況的簽名應該是這樣的:

def zipAll[A](that: collection.Iterable[A], thisElem: (K, V), thatElem: A): Map[(K, V), A] 

它看起來像腳本感到困惑,並且在簽名中用(K, V)代替A

+0

那麼你會得到什麼?它應該是「Map [A​​,B]」嗎? – Stephen

+0

查看更新。從某種意義上說,是的,你得到了'Map [A​​,B]',但'A's是'this'映射的原始鍵值對,即'type A =(K,V)',所以你會得到'Map [(K,V),B]'結果。 –