Domanda

Ho questo frammento di codice Scala:

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, ", ")

Il prossimo-a-ultima linea compila bene, ma sull'ultima riga ottengo l'errore

  

List[Char] Trovato, List[ScalaObject] richiesto

(labeling ha il tipo Map[State, Set[Char]].)

Sono un po 'sorpreso, dal momento che 1) ho pensato che List[Char] potrebbe essere visto come un sottotipo di List[ScalaObject] (al contrario di Java), e 2) la riga sopra le compilazioni ultima linea! (trans ha Tipo Map[State, Set[State]] però ...)

La domanda è ovvia, che cosa sto facendo male, e come posso risolvere il problema?

È stato utile?

Soluzione

Char non è un sottotipo di ScalaObject.

Nella parte superiore si hanno Any che un super tipo di tutto. Probabilmente si può sostituire con ScalaObject Any e che dovrebbe rendere il codice di compilazione.

http://www.scala-lang.org/node/128 per un diagramma gerarchia tipo.

Nel REPL è possibile utilizzare la funzione implicitamente al tipo rapporti Risoluzione dei problemi:

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

Modifica:? A proposito, sai di mkString

trans(s).mkString("[", ", ", "]")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top