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:
Die Definition von RedBlackSet
lautet wie folgt:
Ich würde also erwarten, dass E
als Int
und nicht als Nothing
und S
als RBTree[Int]
abgeleitet wird - aber es passiert nicht.
und
%Vor%funktioniert gut, aber hässlich aussehen.
Ich habe Mühe zu verstehen, warum E
und S
hier nicht abgeleitet werden. Irgendwelche Hinweise?
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:
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.
Tags und Links scala generics type-inference