【发布时间】:2011-10-16 10:05:12
【问题描述】:
背景信息:我目前正在尝试建立一个通用图形库,其中包含一些不同的搜索算法(我从 Dijkstra 开始)。我设置了一些特征来表示可以在某些类型的图表中找到的方法(例如加权、有向):
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) = { ... }
}
在其他地方,我有一个类作为我想在其上运行 Dijkstra 算法的加权有向图的具体实现:
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。为什么它无法推断出该类型参数,我该如何解决?
附:我尝试执行以下操作,并让它工作,但这对于应该是一种方便的方法来说似乎非常不方便:
type Helpful = WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge]
val (dist, prev) = GraphOps.Dijkstra[Position,Edge,Helpful](graph, Position(0,0))
【问题讨论】:
-
您确实意识到已经有一个图形库,不是吗?
-
因为我这样做是出于业余爱好,而且由于几分钟的搜索并没有得出明确的答案,我想我不妨自己整理一下。
-
我很好奇你到底用什么词谷歌?我尝试了 'scala graph library' 并得到了这个:code.google.com/p/scala-graphs 这不是给你的吗?
-
那个项目没有下载也没有源代码。我搜索了那个确切的术语并确实找到了,以及 StackOverflow 问题中提到它已经死了。
-
下面链接的图形库正在积极开发中,希望被包含在 Scala 集合库中。发行说明和路线图看起来很有希望。 assembla.com/spaces/scala-graph/wiki
标签: generics scala generic-type-argument