Warum ist die Syntax von Scala für Tupel so ungewöhnlich?
In Mathematik und informatik, ein Tupel ist eine geordnete Liste von Elementen. Im set-Theorie, die eine (geordnete) n-Tupel ist eine Folge (oder sortierte Liste) von n Elementen, wobei n eine positive ganze Zahl.
So, zum Beispiel, in der Python das 2. Element eines Tupels zuzugreifen über t[1]
.
In der Scala, der Zugang ist nur möglich über seltsame Namen t._2
.
Die Frage ist also, warum kann ich nicht den Zugriff auf Daten in Tupeln als Sequenz oder Liste, wenn es ist per definition? Gibt es irgendeine Art von Idee oder einfach nur noch nicht geprüft?
InformationsquelleAutor der Frage yura | 2011-07-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Scala kennt die stelligkeit der Tupel und ist somit in der Lage zu bieten Zugriffsmethoden wie
_1
_2
usw., und produzieren einen Laufzeitfehler, wenn Sie_3
auf ein paar, zum Beispiel. Außerdem, der Typ der Felder ist genau das, was der Typ als parameter fürTuple
(z.B._3
auf eineTuple3[Int, Double, Float]
zurückFloat
).Wenn Sie Zugriff auf das N-te element, Sie können schreiben
tuple.productElement(n)
aber der return-Typ kann nurAny
so verlieren Sie die Typ-Informationen.InformationsquelleAutor der Antwort Jean-Philippe Pellet
Ich glaube, der folgende Auszug aus "Programming in Scala: A Comprehensive Step-by-Step Guide" (Martin Odersky, Lex Spoon und Bill Venners) bezieht sich unmittelbar auf Ihre beiden Fragen:
Scala-Tupeln sehr wenig bevorzugte Behandlung so weit wie die Sprache, die syntax betrifft, abgesehen von Ausdrücken
'(' a1, ..., an ')'
behandelt der compiler als alias für scala.Tuplen(a1, ..., eine) Klasse Instanziierung. Ansonsten Tupel tun, Verhalten sich wie alle anderen Scala-Objekte, in der Tat, Sie sind geschrieben in Scala als Fall Klassen, die eine Reichweite von Tuple2 zu Tuple22. Tuple2 und Tuple3 sind auch bekannt unter dem Aliasnamen von Paar-und Dreibettzimmer jeweils:InformationsquelleAutor der Antwort Vlad Gudim
Einen großen Unterschied zwischen
List
Seq
oder jede Sammlung und Tupel ist, dass im Tupel jedes element hat seine eigene Art, wo in der Liste alle Elemente haben den gleichen Typ.Als Konsequenz, in Scala finden Sie Klassen, wie
Tuple2[T1, T2]
oderTuple3[T1, T2, T3]
so dass für jedes element, das Sie haben auch Typ-parameter. Kollektionen akzeptiert nur 1 parameter Typ: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 zurückliefern, Korrespondent element.InformationsquelleAutor der Antwort tenshi
Können Sie ganz einfach erreichen, dass mit formlose:
Eine Menge von Methoden zur Verfügung für die standard-Kollektion sind auch für Tupel dieser Art (
head
tail
init
last
++
und:::
für Verkettung+:
und:+
für das hinzufügen von Elementen,take
drop
reverse
zip
unzip
length
toList
toArray
to[Collection]
...)InformationsquelleAutor der Antwort al3xar
Mit normalen index-Zugriff, jeder Ausdruck kann verwendet werden, und es würde einige ernsthafte Anstrengung, um zu überprüfen, zu compile-Zeit, wenn das Ergebnis der index-Ausdruck wird es garantiert in Reichweite sein. Machen Sie es ein Attribut, und eine compile-time error für
(1, 2)._3
folgt "for free". Dinge wie erlauben nur integer-Konstanten innerhalb Element Zugriff auf Tupel wäre ein sehr spezieller Fall (hässlich und unnötig, manche würden sagen lächerlich) und wieder einige arbeiten an der Umsetzung in den compiler.Python, zum Beispiel, bekommen kann Weg mit, dass, da er sich nicht (konnte nicht) überprüfen (at compile-Zeit, das ist) wenn der index in range sowieso.
InformationsquelleAutor der Antwort
Ich denke, es ist für die Typprüfung. Als delnan sagt, wenn Sie ein Tupel
t
und ein indexe
(ein beliebiger Ausdruck)t(e)
geben würde der compiler keine Informationen über das element zugegriffen wird (oder sogar, wenn es ein gültiges element für ein Tupel in der Größe). Beim Zugriff auf Elemente von Feld-name (_2
ist ein Gültiger Bezeichner ist, es ist keine Besondere syntax), der compiler weiß, welches Feld Sie zugreifen und welche Art es ist. Sprachen wie Python nicht wirklich Typen, so ist dies für Sie nicht notwendig.InformationsquelleAutor der Antwort Jay Conrod
Abgesehen von den Vorteilen Jean-Philippe Pellet bereits erwähnt, ist diese Schreibweise auch sehr Häufig in der Mathematik (siehe http://en.wikipedia.org/wiki/Tuple). Viele Dozenten Anhängen von Indizes an, die Tupel-Variablen, wenn Sie wollen, bezogen auf die Elemente eines Tupels. Und das gemeinsame (LaTeX) notation für das schreiben "mit dem index n" (gemeint ist die n-te element des Tupels)
_n
. Also ich finde es eigentlich sehr intuitiv.InformationsquelleAutor der Antwort Stefan Endrullis