Ich versuche einen generischen Restklassenring in Scala zu definieren. Ein Restklassenring wird durch irgendeinen Basisring (z. B. die ganzen Zahlen) und einen Modul (z. B. zwei) definiert, der ein Wert aus dem Basisring ist. Beide Ringe und ihre Elemente sind Objekte, daher wäre die Art des Moduls normalerweise abhängig vom Typ des Basisrings. Ich verstehe, dass dies in Scala nicht erlaubt ist (aus guten Gründen), also versuche ich es zu emulieren, indem ich den Typ approximiere und eine Laufzeitprüfung mache, wenn der Restklassenring konstruiert wird.
Die Definition von ResidueClassRing
wird ohne Fehler akzeptiert, aber Scala lässt mich nicht instanziieren, für das Argument two
erhalte ich die Fehlermeldung
Mache ich etwas falsch? Könnte das ein Fehler im Scala Type Checker sein? Gibt es eine bessere Möglichkeit, ResidueClassRing
zu definieren?
Dies ist mit Scala 2.8.0 in der Eclipse IDE für Helios. Das Problem ist bereits für 2.7.x aufgetreten. Hier ist eine vereinfachte Version des Codes:
%Vor% UPDATE: IntRing
hinzugefügt, um Änderungen in trait Ring
Das Problem scheint zu sein, dass der Inferenztyp nicht automatisch den spezifischsten Typ auswählt, der in Ihrem Fall benötigt wird. Darüber hinaus können Sie kein abhängiges Typargument in derselben Parameterliste wie den Definitionstyp haben.
Sie können die Instanz, von der der Typ abhängt, im äußeren Bereich abrufen (was in der Rings
-Klasse geschieht) und den Compiler dazu zwingen, den spezifischsten Typ auszuwählen, wenn Sie die Klasse Rings
instanziieren :
Jetzt können Sie es wie folgt verwenden:
%Vor%Tags und Links scala types dependent-type path-dependent-type