Scala не может вывести правильные аргументы типа

Справочная информация: В настоящее время я пытаюсь создать общую библиотеку графов, которая включает несколько различных алгоритмов поиска (я начал с алгоритма Дейкстры) . Я установил несколько черт для представления методов, которые можно найти в определенных типах графов (например, взвешенных, направленных):

trait GraphOps[V,E] { ... }
trait WeightedGraphOps[V,E] extends GraphOps[V,E] { ... }
trait DirectedGraphOps[V,E] extends GraphOps[V,E] { ... }
object GraphOps{
  def Dijkstra[V,E,G <: WeightedGraphOps[V,E] with DirectedGraphOps[V,E]](graph:G, start:V) = { ... }
}

В другом месте у меня есть класс как конкретная реализация взвешенного ориентированного графа, который я хочу запустить алгоритм Дейкстры на:

class GraphMap[T](...)
extends scala.collection.mutable.Map[Position,T]
with WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge] { ... }

Но когда я пытаюсь проверить его:

val graph = new GraphMap[Int](...)
val (dist, prev) = GraphOps.Dijkstra(graph, Position(0,0))

Вопрос: Я получаю следующую ошибку во время компиляции: ошибка: аргументы предполагаемого типа [com.dylan.data.Position, Ничего, com.dylan.data.GraphMap [Int]] не соответствует границам параметра типа метода Дейкстры [V, E, G <: com.dylan.data.WeightedGraphOps [V, E] с com.dylan.data.DirectedGraphOps [V, E]]
Мне потребовалось достаточно времени, чтобы заметить, что он выводит мой тип Edge ( E ) как Ничего , но я не понимаю, почему он не работает успешно сделать вывод, что это должен быть Edge . Почему не удается определить этот параметр типа и как его исправить?

P.S. Я попытался сделать следующее, и он заработал, но это кажется ужасно неудобным для того, что должно было быть удобным методом:

type Helpful = WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge]
val (dist, prev) = GraphOps.Dijkstra[Position,Edge,Helpful](graph, Position(0,0))
5
задан Dylan 30 July 2011 в 06:13
поделиться