背景情報:私は現在、いくつかの異なる検索アルゴリズム(私はDijkstraで始まっています)を含む一般的なグラフライブラリを設定しようとしています。私は(例えば、加重監督)グラフの特定の種類で見られる方法を表すために、いくつかの特性を設定している:他の場所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))
が質問: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
であると推測できないのかわかりません。その型パラメータを推測できないのはなぜですか、どうすれば修正できますか?
P.S.私は、次のことをやってみました、それが動作するようになったが、これは便利な方法になるはずだった何のために恐ろしく不便なようだ:
type Helpful = WeightedGraphOps[Position,Edge] with DirectedGraphOps[Position,Edge]
val (dist, prev) = GraphOps.Dijkstra[Position,Edge,Helpful](graph, Position(0,0))
既にグラフライブラリがありますか? –
私は趣味のためにこれをやっているので、周りを検索して数分で決定的な答えにつながっていないので、私は自分自身を一緒に置くかもしれないと思った。 – Dylan
私は何の言葉を正確にGoogleにしたのですか?私は 'スカラーグラフライブラリ'を試して、これを持っています:http://code.google.com/p/scala-graphs/あなたのためにこれはありませんか? – AndreasScheinert