Frage

Ich habe diesen Schnipsel von Scala Code:

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 letzter Zeile compiliert in Ordnung, aber in der letzten Zeile erhalte ich die Fehler

  

Gefunden List[Char], erforderlich List[ScalaObject]

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

Ich bin ein wenig überrascht, da 1) Ich dachte, dass List[Char] als Subtyp von List[ScalaObject] zu sehen ist (im Gegensatz zu Java im Gegensatz), und 2) die Zeile oberhalb der letzte Zeile kompiliert! (trans hat Typ Map[State, Set[State]] obwohl ...)

Die Frage liegt auf der Hand, was ich tue, falsch, und wie kann ich das Problem beheben?

War es hilfreich?

Lösung

Char ist kein Subtyp von ScalaObject.

An der Spitze haben Sie Any die einen Supertyp von allem. Sie können sich wahrscheinlich ScalaObject mit Any ersetzen und das sollte Kompilieren des Codes machen.

Siehe http://www.scala-lang.org/node/128 für einen Typ Hierarchiediagramm.

In der REPL Sie die implizit Funktion zu beheben Typ Beziehungen verwenden können:

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]]

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

trans(s).mkString("[", ", ", "]")
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top