Справочная информация: В настоящее время я пытаюсь настроить универсальную библиотеку графов, которая включает в себя несколько различных алгоритмов поиска (я начал с Дейкстры).Я настроил несколько признаков для представления методов, которые можно найти в определенных типах графиков (например, взвешенные, направленные):
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))
Вопрос: Я получаю следующееошибка во время компиляции: error: inferred type arguments [com.dylan.data.Position,Nothing,com.dylan.data.GraphMap[Int]] do not conform to method Dijkstra's type parameter bounds [V,E,G <: com.dylan.data.WeightedGraphOps[V,E] with com.dylan.data.DirectedGraphOps[V,E]]
Мне потребовалось достаточно много времени, чтобы заметить, что мой тип Edge (E
) выводится как Nothing
, но я не понимаю, почему он не может сделать вывод, что он должен бытьEdge
.Почему он не может определить этот параметр типа и как я могу это исправить?
PS Я попытался сделать следующее и заставил его работать, но это кажется ужасно неудобным для того, что должно было быть удобным методом:
type Helpful = WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge]
val (dist, prev) = GraphOps.Dijkstra[Position,Edge,Helpful](graph, Position(0,0))