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.
Bedeutet nichts, es ist falsch und ich habe keine Ahnung, warum das Ding noch da ist. –
Mit "immer noch" meinen Sie, dass dies ein bekanntes/bereits gemeldetes Problem ist? –
Eigentlich denke ich, meine Frage dupliziert diese https://stackoverflow.com/q/26132459/842860 – stackoverflower