2010-11-20 18 views
2

J'ai ce bout de code Scala:erreur Scala: Liste Trouvé [Char], nécessaire 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, ", ") 

La prochaine à la dernière ligne compile très bien, mais sur la dernière ligne je reçois la erreur

Found List[Char] , required List[ScalaObject]

(labeling a le type Map[State, Set[Char]].)

Je suis un peu surpris, car 1) Je pensais que List[Char] pourrait être considéré comme un sous-type de List[ScalaObject] (par opposition à Java), et 2) la ligne au-dessus de la dernière ligne compile! (trans si le type Map[State, Set[State]] si ...)

La question est évidente, qu'est-ce que je fais mal, et comment puis-je le réparer?

Répondre

4

Char n'est pas un sous-type de ScalaObject.

En haut vous avez Any qui est un super type de tout. Vous pouvez probablement remplacer ScalaObject par Any et cela devrait rendre votre code compilé. Voir http://www.scala-lang.org/node/128 pour un diagramme de hiérarchie de types.

Dans le REPL, vous pouvez utiliser la fonction implicitement pour résoudre les relations de type:

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: A propos, savez-vous mkString?

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

parfait, merci !! et merci pour mkString;) – aioobe