In der Mathematik und Informatik ist ein Tupel eine geordnete Liste von Elementen. In der Mengenlehre ist ein (geordnetes) n-Tupel eine Folge (oder geordnete Liste) von n Elementen, wobei n eine positive ganze Zahl ist.
So würde beispielsweise in Python auf das zweite Element eines Tupels über zugegriffen t[1]
.
In Scala ist der Zugriff nur über fremde Namen möglich t._2
.
Die Frage ist also, warum ich nicht auf Daten in Tupeln als Sequenz oder Liste zugreifen kann, wenn dies per Definition der Fall ist. Gibt es eine Idee oder nur noch nicht geprüft?
productIterator
sodass in einigen Fällen ein spezifischerer Typ verwendet werden kann. Dies könnte für 2.10 kommen, aber jemand korrigiert mich, wenn ich falsch liege.t[1]
alle Typinformationen zuzulassen und zu behalten und einfacht[exp]
(wobei das Ergebnis von exp zur Kompilierungszeit unbekannt ist) einen Rückgabetyp von zu habenAny
, oder? Es scheint also, dass die andere Syntax eher dazu dient, dem Programmierer klar zu machen, dass ein Tupel keine Liste ist.t[exp]
sind genau das, was t.productElement (exp) `tut. Beachten Sie, dass in Scala eckige Klammern nur für Typparameter verwendet werden.-Xexperimental
in 2.10 Trunk, aber nur für Fallklassen , nicht für Tupel. Keine Ahnung warum.Ich glaube, der folgende Auszug aus "Programmieren in Scala: Eine umfassende Schritt-für-Schritt-Anleitung" (Martin Odersky, Lex Spoon und Bill Venners) geht direkt auf Ihre beiden Fragen ein:
Scala-Tupel werden in Bezug auf die Sprachsyntax kaum bevorzugt behandelt, abgesehen davon, dass Ausdrücke
'(' a1, ..., an ')'
vom Compiler als Alias für die Instanziierung von scala.Tuplen ( a1, ..., an ) behandelt werden. Andernfalls verhalten sich Tupel wie alle anderen Scala-Objekte. Tatsächlich werden sie in Scala als Fallklassen geschrieben , die von Tuple2 bis Tuple22 reichen . Tuple2 und Tuple3 sind auch unter den Decknamen Pair und Triple bekannt:val a = Pair (1,"two") // same as Tuple2 (1,"two") or (1,"two") val b = Triple (1,"two",3.0) // same as Tuple3 (1,"two",3.0) or (1,"two",3.0)
quelle
Tuple1
wurde hinzugefügt.Ein großer Unterschied zwischen
List
,Seq
oder jede Sammlung und Tupel in Tupel , dass jedes Element seine eigene Art hat , wo die in der Liste alle Elemente denselben Typ haben.Infolgedessen finden Sie in Scala Klassen wie
Tuple2[T1, T2]
oderTuple3[T1, T2, T3]
, sodass Sie für jedes Element auch einen Typparameter haben. Sammlungen akzeptieren nur 1 Typparameter :List[T]
. Syntax wie("Test", 123, new Date)
ist nur syntaktischer Zucker fürTuple3[String, Int, Date]
. Und_1
,_2
usw. sind nur Felder auf Tupel dass die Rückkehr Korrespondent Element.quelle
Sie können das leicht mit formlos erreichen :
import shapeless.syntax.std.tuple._ val t = ("a", 2, true, 0.0) val s = t(0) // String at compile time val i = t(1) // Int at compile time // etc
Viele Methoden zur Standardsammlung sind auch für diese Weise Tupeln (verfügbar
head
,tail
,init
,last
,++
und:::
für die Verkettung,+:
und:+
Elemente für das Hinzufügen,take
,drop
,reverse
,zip
,unzip
,length
,toList
,toArray
,to[Collection]
, ...)quelle
Ich denke, es ist für die Typprüfung. Wie delnan sagt, wenn Sie ein Tupel
t
und einen Indexe
(einen beliebigen Ausdruck) haben,t(e)
würde der Compiler keine Informationen darüber erhalten, auf welches Element zugegriffen wird (oder selbst wenn es ein gültiges Element für ein Tupel dieser Größe ist). Wenn Sie über den Feldnamen auf Elemente zugreifen (dies_2
ist eine gültige Kennung, keine spezielle Syntax), weiß der Compiler, auf welches Feld Sie zugreifen und welchen Typ es hat. Sprachen wie Python haben eigentlich keine Typen, daher ist dies für sie nicht erforderlich.quelle
Bei normalem Indexzugriff kann jeder Ausdruck verwendet werden, und es würde einige ernsthafte Anstrengungen erfordern, um beim Kompilieren zu überprüfen, ob das Ergebnis des Indexausdrucks garantiert im Bereich liegt. Machen Sie es zu einem Attribut und ein Fehler zur Kompilierungszeit für
(1, 2)._3
folgt "kostenlos". Dinge wie das Zulassen nur ganzzahliger Konstanten innerhalb des Elementzugriffs auf Tupel wären ein ganz besonderer Fall (hässlich und unnötig, manche würden sagen lächerlich) und wieder einige Arbeiten, die im Compiler implementiert werden müssen.Python zum Beispiel kann damit durchkommen, weil es (zum Zeitpunkt der Kompilierung) nicht prüfen würde (konnte), ob der Index ohnehin im Bereich liegt.
quelle
Abgesehen von den bereits erwähnten Vorteilen von Jean-Philippe Pellet ist diese Notation auch in der Mathematik sehr verbreitet (siehe http://en.wikipedia.org/wiki/Tuple ). Viele Dozenten hängen Indizes an Tupelvariablen an, wenn sie sich auf die Elemente eines Tupels beziehen möchten. Und die übliche (LaTeX) Notation zum Schreiben von "mit Index n " (bezogen auf das n- te Element des Tupels) lautet
_n
. Also ich finde es eigentlich sehr intuitiv.quelle