Ich versuche, die Antwort von a preceding question zu verwenden, um eine kleine Grafikbibliothek zu implementieren. Die Idee besteht darin, Graphen als Ausschnitte zu betrachten, bei denen Eckpunkte Sammlungselemente umhüllen.Mischtyp Parameter und abstrakte Typen in scala
Ich möchte abstrakte Typen verwenden, um Vertex- und Edge-Typen darzustellen (wegen Typ Sicherheit) und ich möchte Typ-Parameter verwenden, um den Typ der Auflistungselemente darzustellen (weil ich sie bei Instanziierung einfach definieren möchte).
Wenn ich jedoch das grundlegendste Beispiel versuche, kann ich darüber nachdenken, dass ich mit Kompilierungsfehlern festhalte. Hier ist das Beispiel:
package graph
abstract class GraphKind[T] {
type V <: Vertex[T]
type G <: Graph[T]
def newGraph(): G
abstract class Graph[T] extends Collection[T]{
self: G =>
def vertices(): List[V]
def add(t: T): Unit
def size(): Int
def elements(): Iterator[T]
}
trait Vertex[T] {
self: V =>
def graph(): G
def value(): T
}
}
Und hier ist die grundlegende Implementierungen:
class SimpleGraphKind[T] extends GraphKind[T] {
type G = GraphImpl[T]
type V = VertexImpl[T]
def newGraph() = new GraphImpl[T]
class GraphImpl[T] extends Graph[T] {
private var vertices_ = List[V]()
def vertices = vertices_
def add(t: T) { vertices_ ::= new VertexImpl[T](t,this) }
def size() = vertices_.size
def elements() = vertices.map(_.value).elements
}
class VertexImpl[T](val value: T, val graph: GraphImpl[T]) extends Vertex[T] {
override lazy val toString = "Vertex(" + value.toString + ")"
}
}
Wenn zu kompilieren versuchen, erhalte ich:
/prg/ScalaGraph/study/Graph.scala:10: error: illegal inheritance;
self-type GraphKind.this.G does not conform to Collection[T]'s selftype Collection[T]
abstract class Graph[T] extends Collection[T]{
^
/prg/ScalaGraph/study/Graph.scala:33: error: illegal inheritance;
self-type SimpleGraphKind.this.GraphImpl[T] does not conform to SimpleGraphKind.this.Graph[T]'s selftype SimpleGraphKind.this.G
class GraphImpl[T] extends Graph[T] {
^
/prg/ScalaGraph/study/Graph.scala:36: error: type mismatch;
found : SimpleGraphKind.this.VertexImpl[T]
required: SimpleGraphKind.this.V
def add(t: T) { vertices_ ::= new VertexImpl[T](t,this) }
^
/prg/ScalaGraph/study/Graph.scala:38: error: type mismatch;
found : Iterator[T(in class SimpleGraphKind)]
required: Iterator[T(in class GraphImpl)]
def elements() = vertices.map(_.value).elements
^
/prg/ScalaGraph/study/Graph.scala:41: error: illegal inheritance;
self-type SimpleGraphKind.this.VertexImpl[T] does not conform to SimpleGraphKind.this.Vertex[T]'s selftype SimpleGraphKind.this.V
class VertexImpl[T](val value: T, val graph: GraphImpl[T]) extends Vertex[T] {
^
5 errors found
Ich habe absolut keine Ahnung von der Bedeutung des diese Fehler ... Wenn ich jedoch den Typ T in der Implementierung spezialisiere (bekomme ich nur den ersten Fehler.
Haben Sie Ideen?
Können Sie erklären, warum Sie möchten, dass ein Diagramm eine Sammlung ist? –
Eine Anwendung dieser Bibliothek wäre es, eine Art von zellulären Automaten auf einem Graphen zu implementieren (der andere ist die Erforschung komplexer Netzwerke). Es könnte dann nett sein, direkt auf die in den Scheitelpunkten eingeschlossenen Zellenobjekte zuzugreifen ... Aber wenn Sie eine Idee der Lösung ohne den Graphen als Sammlungsmerkmal haben, interessiert mich das auch. – paradigmatic
Ich bin mir immer noch nicht sicher, ob ich die Verbindung sehe. Wie würden Sie Ihre Graphenbibliothek von JGraphT unterscheiden? Ist es ein funktionaler Ansatz für Graphen? –