Ich habe eine grundlegende Frage zu Liste
Ich erhalte den folgenden Fehler, als ich versuchte, eine Liste mit Cons-Operator zu erstellen
%Vor%Aber wenn du unten schaust, sobald ich Nil am Ende hinzufüge, funktioniert es ..
%Vor%Ich würde gerne wissen, warum Nil mindestens einmal am Ende benötigt wird, wenn wir eine Liste erstellen
Ist Nil ein Datentyp? oder leeres Element?
Genau aus diesem Grund.
value :: ist kein Mitglied von Int
In Scala funktionieren die Operatoren eigentlich auf Objekten. In diesem Fall ist ::
eine Funktion für Nil
-Objekt, das ist eigentlich ein leeres Listenobjekt .
Wenn Sie 1::2
verwenden, sucht Scala nach der Funktion ::
in 2
und findet diese nicht. Deshalb scheitert es mit diesem Fehler.
Hinweis: Wenn in scala das letzte Zeichen des Operators kein Doppelpunkt ist, wird der Operator für den ersten Operanden aufgerufen. Zum Beispiel ist 1 + 2
im Grunde 1.+(2)
. Wenn das letzte Zeichen jedoch ein Doppelpunkt ist, wird der Operator auf dem rechten Operanden aufgerufen. In diesem Fall ist 1 :: Nil
tatsächlich Nil.::(1)
. Da das ::
ein anderes Listenobjekt zurückgibt, können Sie es verketten, wie dies 1 :: 2 :: Nil
tatsächlich ist, Nil.::(2).::(1)
.
Infix-Operatoren, deren Namen mit :
enden, werden als Methodenaufrufe am Operanden rechts interpretiert. Also 1 :: 2
ist 2.::(1)
, d.h. es ruft die Methode ::
auf 2
auf. Ähnlich 1 :: 2 :: Nil
ist Nil.::(2).::(1)
.
Der Grund dafür, dass der erste nicht funktioniert, ist, dass 2
ein Int
ist und Int
s keine ::
Methode. Der Grund dafür, dass der zweite funktioniert, ist, dass Nil
eine Liste ist und Listen eine ::
Methode haben. Und da das Ergebnis von List.::
auch eine Liste ist, können Sie immer ::
für das Ergebnis der ersten ::
aufrufen.
Nil
ist der grundlegende Baustein zum Erstellen von List
als rekursive Datenstruktur . Liste ist eine nützliche Datenstruktur, die einen konstanten Zeitzugriff O (1) auf den Kopf (erstes Element) bereitstellt.
Liste bei seinem minimalen Kern, ist auf 3 Operationen aufgebaut
head
, tail
und isEmpty
. Nil
ist eine Singleton-Unterklasse von List
. Es handelt sich also um eine spezielle Instanz, die eine leere Liste darstellt. Der cons -Operator ::
wird in List definiert, um eine Liste rekursiv zu erstellen, indem ein Element in der Liste vorangestellt wird.
Siehe Definition von Merkmal List
und Objekt Nil
(stark vereinfacht)
Da jeder Bezeichner / Operator, der mit einem :
endet, mit dem rechten verknüpft wird, wird der Operator ::
ebenfalls mit dem Recht verknüpft.
Wenn Sie 1::2::3
schreiben, versucht scala, diese Aufrufe als 3.::(2.::(1))
neu zu schreiben. d. h. 3 wird der Empfänger des ersten Aufrufs von ::
, der nicht in einem beliebigen Datentyp existiert (Int in diesem Fall).
Aus diesem Grund erstellen Sie immer auf einer Empty List - Nil. Stellen Sie sich vor, dass jedes Element einzeln über die leere Liste Nil
vorangestellt wird.
Jeder Operator in Scala, der mit einem Doppelpunkt :
endet, ist am rechten Operanden definiert.
Wenn Sie also 1::2
schreiben, bedeutet dies, dass ::
für 2
definiert sein sollte, d. H. Für Int
, was nicht der Fall ist.
Nil
ist ein Wert von List
und hat eine Methode ::
definiert. Wenn Sie also 1 :: 2 :: Nil
schreiben, wird dies als (Nil.::(2)).::(1)
ausgewertet.