2016-10-28 1 views
0

Ich bin in Scala und den ersten Kapiteln durch Funktionale Programmierung arbeiten definieren diese Art der Datenstruktur:Ändern der Liste Klasse

sealed trait List[+A] 
case object Nil extends List[Nothing] 
case class Cons[+A](head: A, tail: List[A]) extends List[A] 

Wenn ich versuche, eine verknüpfte Liste wie folgt zu definieren; es funktioniert wie erwartet:

val nums: List[Int] = Cons(1, Cons(2, Cons(3, Nil))); 

ich aber ich versuche, eine verknüpfte Liste wie folgt zu definieren, aber ich bekomme einen Kompilierungsfehler (Expression von Typ scala.collection.immutable.List [Int] entspricht nicht erwartet type List [Int]:

val nums: List[Int] = List[Int](1, 2, 3) 

Meine Frage ist - 1) Deklariert die Deklaration der Datenstruktur die interne Klasse der Liste? 2) Warum kann die zweite Struktur nicht verwendet werden?

Antwort

5

1) Deklariert die Deklaration der Datenstruktur die interne Klasse von List?

Nr

2) Warum kann die zweite Struktur verwendet werden?

Sie rufen die apply Methode des Objekts List auf. Das einzige Objekt mit dem Namen List, das sich im Gültigkeitsbereich befindet, lautet scala.collection.immutable.List object, und its apply method gibt eine Instanz scala.collection.immutable.List zurück. Sie haben jedoch nums als List[Int], nicht scala.collection.immutable.List[Int] deklariert, daher sind die beiden Typen nicht kompatibel.

Sie benötigen eine eigene List Objekt, zum Beispiel wie folgt schreiben:

object List { 
    def apply[A](elements: A*): List[A] = 
    if (elements.isEmpty) Nil else Cons(elements.head, apply(elements.tail :_*)) 
} 
Verwandte Themen