2010-11-20 9 views
2

ich diesen Ausschnitt aus Scala-Code haben:Scala Fehler: gefunden Liste [Char], erforderlich Liste [ScalaObject]

def prologList(l: List[ScalaObject], sep: String) = 
    "[" + (if (l isEmpty) "" else l.reduceLeft(_ + sep + _)) + "]" 

def neighbors(s: State) = prologList(trans(s).toList, ", ") 
def labels(s: State) = prologList(labeling(s).toList, ", ") 

Die nächste zu letzten Zeile kompiliert in Ordnung, aber in der letzten Zeile bekomme ich die

Fehler

Found List[Char] , required List[ScalaObject]

(labeling hat den Typ Map[State, Set[Char]].)

ich ein wenig überrascht bin, da 1) ich dachte, dass List[Char] als Subtyp vonzu sehen war(im Gegensatz zu Java) und 2) die Zeile über der letzten Zeile kompiliert! (trans hat Typ Map[State, Set[State]] obwohl ...)

Die Frage ist offensichtlich, was mache ich falsch, und wie repariere ich es?

Antwort

4

Char ist kein Untertyp von ScalaObject.

An der Spitze haben Sie Any, die eine super Art von allem. Sie können wahrscheinlich ScalaObject durch Any ersetzen, und das sollte Ihren Code kompilieren.

Siehe http://www.scala-lang.org/node/128 für ein Typhierarchiediagramm.

scala> implicitly[Char <:< Any] 
res0: <:<[Char,Any] = <function1> 

scala> implicitly[Char <:< ScalaObject] 
<console>:6: error: could not find implicit value for parameter e: <:<[Char,ScalaObject] 
     implicitly[Char <:< ScalaObject] 
       ^

scala> implicitly[List[Char] <:< List[Any]] 
res2: <:<[List[Char],List[Any]] = <function1> 

scala> implicitly[List[Char] <:< List[ScalaObject]] 
<console>:6: error: could not find implicit value for parameter e: <:<[List[Char],List[ScalaObject]] 
     implicitly[List[Char] <:< List[ScalaObject]] 

bearbeiten

: durch die Art und Weise, wissen Sie über mkString

Im REPL Sie der Typ Beziehungen implizit zu beheben Funktion nutzen zu können?

trans(s).mkString("[", ", ", "]") 
+0

perfekt, danke !! und danke für mkString;) – aioobe