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 成为 Graph trait 的内部特征,它具有所有类型参数。这样,Vertex 可以知道 Edge trait 的 ID 类型,Edge 可以知道 Vertex trait 的 ID 和 Data 类型。

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 只能有在同一个 Graph 中的端点,而 Vertex 只能有在同一个 Graph 中的边。

于 2012-09-12T06:27:53.067 回答