1

VertexEdgeのタイプが相互に依存する単純なグラフ表現を作成したいとします。具体的な実装は次のようになります。

case class Edge(id: Int, label: String, endpoints: (Vertex, Vertex))
case class Vertex(id: Int, data: Data, edges: Map[Int, Edge])

Edgeに依存しVertex、その逆も同様です。私が本当に欲しいのはiddataなどにジェネリック型を持たせることです。そして、これを最良の方法で設計する方法を知りたいですか?

trait Vertex[A, B] {
  def id: A
  def data: B
  // What about types for the edges etc?
}

trait Edge[A, ...] {
  def id: A
  def label: String
  def endpoints: (Vertex[...], Vertex[...])
}

この簡単な例をいただければ幸いです。

4

2 に答える 2

0

タイプパラメータを再利用することの何が問題になっていますか?

trait Vertex[A, B] {
  def id: A
  def data: B
  def edges: Map[A, Edge[A, B]]
}

そしてEdge

trait Edge[A, B] {
  def id: A
  def label: String
  def endpoints: (Vertex[A, B], Vertex[A, B])
}
于 2012-09-11T08:59:37.530 に答える
0

VertexとEdgeは異なるIDタイプを持つことができるため、VertexとEdgeを、すべてのタイプパラメータを持つグラフトレイトの内部トレイトにすることができます。このようにして、VertexはEdgeトレイトのIDタイプを認識でき、EdgeはVertexトレイトのIDとデータタイプを認識できます。

trait Graph[VertexID, EdgeID, Data] {

  trait Vertex {
    def id: VertexID
    def data: Data
    def edges: Map[EdgeID, Edge]
  }

  trait Edge {
    def id: EdgeID
    def label: String
    def endpoints: (Vertex, Vertex)
  }

}

ちなみに、パスに依存するタイプのため、Edgeは同じグラフにあるエンドポイントしか持てず、Vertexは同じグラフにあるエッジしか持てません。

于 2012-09-12T06:27:53.067 に答える