2012-09-11 35 views
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,反之亦然。我真正想要的是id,data等具有通用類型。我想知道如何設計這個最好的方法?

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[...]) 
} 

一個簡單的例子將不勝感激。

回答

0

由於頂點和邊可以有不同的ID類型,您可能希望有頂點和邊是一個圖形特徵的內在特質,它具有所有類型參數。這樣,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) 
    } 

} 

順便提及,由於路徑依賴類型,邊緣只能夠具有端點,因爲他們位於相同的圖形,和頂點將僅能夠具有邊緣,其在相同的圖形。

+0

正是我在想什麼。非常感謝! – chrsan

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]) 
} 
+0

'Vertex'和'Edge'的id可以是不同的類型,你錯過了地圖中'Edge'的一種類型,但是沒有,沒有錯。只是想知道這是否是解決問題的最好方法。謝謝! – chrsan

+0

'Map'在'K'中是不變的,所以你不能在'A'中做'Vertex'協變,這意味着你不能在'A'中做'Edge'協變。但是你說'B'是對的。 –

+0

@Jorg - 好點,我錯過了那 –