Generische Vererbung in Scala

8

Ich versuche ein paar Strukturen aus Okasakis Buch in Scala zu implementieren und versuche in Tests die eigentlichen Tests in der Basisklasse zu halten, wobei ich nur Subklassen verwende, um die zu testende Instanz zu liefern.

Ein Test für unsymmetrische (Baum-) Mengen sieht beispielsweise wie folgt aus:

%Vor%

wo

%Vor%

Nun möchte ich manchmal die Kindspezifikation spezialisieren, z. B.

%Vor%

es schlägt fehl, weil es keine Methode isValid auf Set[E, S] gibt - sie ist in RedBlackSet[E] definiert. Aber wenn ich weiter gehe und SetSpec[E, S](val set: Set[E, S]) in SetSpec[E, S, SES <: Set[E, S]](val set: SES) ändere, verschwindet dieses spezielle Problem, aber der Code kann immer noch nicht kompiliert werden:

%Vor%

Die Definition von RedBlackSet lautet wie folgt:

%Vor%

Ich würde also erwarten, dass E als Int und nicht als Nothing und S als RBTree[Int] abgeleitet wird - aber es passiert nicht.

%Vor%

und

%Vor%

funktioniert gut, aber hässlich aussehen.

Ich habe Mühe zu verstehen, warum E und S hier nicht abgeleitet werden. Irgendwelche Hinweise?

    
alf 28.08.2015, 20:36
quelle

1 Antwort

1

Dies ist ein bekanntes Problem mit der Inferenz vom Typ Scala: Es kann nicht SES "first" ableiten und daraus E und S ableiten. Eine Lösung kommt in den Sinn:

%Vor%

Es wird weniger hässlich, wenn Sie set in SetSpec statt eines Konstruktorarguments auf ein abstraktes val setzen, aber in Fällen, in denen Sie nicht spezialisieren müssen, mit einem kleinen Kompromiss. Ich denke, es sollte einen besseren geben, aber das sollte funktionieren.

    
Alexey Romanov 30.08.2015, 14:33
quelle

Tags und Links