2017-02-10 5 views
0

Unten ist die map1.scala Datei in IntelijIDEAMuster passender Typ Fehler

Es scheint, dass ich wieder die Wand traf. Ich habe keine Ahnung, warum die folgenden Fehler ist:

abstract class List[T] { 
    def map[U](f: T => U): List[U] = { 
    this match { 
     case Nil => this 
     case x :: xs => ??? 
    } 
    } 
} 

Fall Nil: Mustertyp ist nicht kompatibel mit dem erwarteten Typ: Ergebnis Nil.type erwartete Liste [T] dies: Ausdruck der Typ List [T] nicht konform zum erwarteten Typ Liste [U] x :: xs Mustertyp inkompatibel gefunden :: B erforderlich Liste [T] ..

Ich habe alles versucht ... Habe aber immer noch dieses Problem. Wie auch immer, bitte antworten Sie.

+5

'Nil' ist eine Art von' list' von Standard-Bibliothek und Sie vergleichen es mit Ihrem eigenen Klasse 'List.' Ihrer Liste' MyList' Umbenennen, 'MyNil 'und verwechsle dich nicht. – ipoteka

Antwort

2

Eigentlich gibt es einige Probleme mit Ihrem Code:

  • invariant Typparameter T der Liste
  • inexistent Objekt Nil
  • abwesende Betreiber ::
  • abwesendes Objekt :: mit Unapply Funktion

Versuchen Sie folgendes:

abstract class List[+A] 
    def head: A 
    def tail: List[A] 

    def map[B](f: A => B): List[B] = 
    if (this == Nil) Nil 
    else new ::(f(head), tail map f) 
} 

case object Nil extends List[Nothing] { 
    def head = ??? // not interested in throwing more appropriate exception 
    def tail = ??? 
} 

case class ::[T](head: T, tail: List[T]) extends List[T] 

Dann können Sie es verwenden

(1 :: 2 :: 3 :: Nil).map(_.toString) 
+0

Vielleicht müssen Sie 'List [T]' in der Fallklasse ':: [T]' –

+0

@Dmitry erweitern, nachdem ich getan habe, was Sie sagten, es trifft mich weiterhin einen Fehler in (Wenn dies == Nil) Nil [ Ausdruck des Typs Nil.type entspricht nicht dem erwarteten Typ Liste [B]] – Spartan

+0

@Spartan Ich vergesse zu machen :: erweitern Liste [T]. Es tut uns leid. – Dmitry