2017-05-26 3 views
4

ich die Scala Karte doc zu lesen, und habe mit dieser Methode Signatur verwechseltscala - Welche Karte [(A, B)] bedeutet?

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

Was bedeutet Map[(A, B)]? Ist es das gleiche wie Map[A, B]? Dank

Link zum doc:

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

+2

Bedeutet nichts, es ist falsch und ich habe keine Ahnung, warum das Ding noch da ist. –

+0

Mit "immer noch" meinen Sie, dass dies ein bekanntes/bereits gemeldetes Problem ist? –

+0

Eigentlich denke ich, meine Frage dupliziert diese https://stackoverflow.com/q/26132459/842860 – stackoverflower

Antwort

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)] 

Dies ist nicht die Methodensignatur. Dies ist die "use case signature". Es ist eine vereinfachte Signatur, die die häufigste Verwendung der Methode angibt. Die realen Signatur ist:

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) syntaktischer Zucker ist für Tuple2[A, B], das heißt ein Paar (auch bekannt als 2-Tupel) -Typ.

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

Nein, Map[Tuple2[A, B]] ist nicht dasselbe wie Map[A, B]: Erstere gilt die Map Typkonstruktor auf einen einzigen Argument (A, B) während letztere den Konstruktor Map Typ Angewandt auf zwei Argumente, A und B.

Beachten Sie, dass der Typenkonstruktor Map zwei Parameter hat, so dass ersteres einfach ein Fehler ist: Sie können den Konstruktor Map nicht nur auf ein einzelnes Argument anwenden, Sie brauchen zwei.

Denken Sie daran, dass die Unterschrift Sie sah nur einen Anwendungsfall ist es von einem menschlichen für Menschen geschrieben zu lesen, ist es nicht durch den Typ-Checker überprüft. Als solche kann es Fehler enthalten.

Beachten Sie auch, dass es viele repetitive Signaturen und Anwendungsfälle für die gesamte Sammlungshierarchie gibt, die von zusätzlichen Skripten generiert werden. Es sieht so aus, als ob eines dieser Skripte einfach eine falsche Signatur für Map.zipAll erzeugt (beachte, dass der gleiche Fehler auch in den anderen zip Varianten auf Map existiert). Ein kleines Experiment zeigt, dass zip die Schlüssel/Wert-Paare der Karte als erstes Element der Ergebnispaare und die Elemente aus der that Sammlung als zweites Element der Ergebnispaare nimmt und was eine Karte, die die ursprünglichen Schlüssel-Wert-Paare als Schlüssel und die other Elemente als Werte hat:

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

so, der vereinfachte Anwendungsfall Unterschrift so etwas wie dies sein sollte:

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

Es sieht so aus, als ob die Skripts verwirrt werden und (K, V) für A in der Signatur ersetzen.

+0

Also, was bekommst du? Sollte es nur "Map [A, B]" sein? – Stephen

+0

Siehe das Update. In gewissem Sinne, ja, erhalten Sie 'Map [A, B]', aber die 'A's sind die ursprünglichen Schlüssel-Wert-Paare der' this' Map, dh 'type A = (K, V)', so Sie erhalten 'Map [(K, V), B]' als Ergebnis. –

Verwandte Themen