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