Warum brauchen wir Nil beim Erstellen von List in scala? [Duplikat]

8

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?

    
Surender Raja 10.06.2016, 06:42
quelle

4 Antworten

9

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 .

%Vor%

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

    
thefourtheye 10.06.2016, 06:47
quelle
6

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.

    
sepp2k 10.06.2016 06:49
quelle
2

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)

%Vor%

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.

    
Pranav Shukla 10.06.2016 07:13
quelle
1

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.

    
curious 10.06.2016 06:50
quelle

Tags und Links