Ошибка Scala: найден список [Char], требуется список [ScalaObject] - PullRequest
2 голосов
/ 20 ноября 2010

У меня есть этот фрагмент кода 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, ", ")

Следующая-последняя строка компилируется нормально, но в последней строке я получаю сообщение об ошибке

Найдено List[Char], требуется List[ScalaObject]

(labeling имеет тип Map[State, Set[Char]].)

Я немного удивлен, так как 1) я думал, что List[Char] можно рассматривать как подтип List[ScalaObject] (в отличие от Java), и 2) строка выше последней строки компилируется! (trans имеет тип Map[State, Set[State]] хотя ...)

Вопрос очевиден, что я делаю не так и как мне это исправить?

1 Ответ

4 голосов
/ 20 ноября 2010

Char не является подтипом ScalaObject.

Вверху у вас есть Any, который супер тип всего. Вы, вероятно, можете заменить ScalaObject на Any, и это должно привести к компиляции вашего кода.

См. http://www.scala -lang.org / node / 128 для диаграммы иерархии типов.

В REPL вы можете использовать неявную функцию для устранения проблем типа отношений:

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

Редактировать: кстати, вы знаете о mkString?

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