So emulieren Sie einen abhängigen Typ in Scala

8

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

%Vor%

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%     
starblue 14.10.2010, 10:20
quelle

2 Antworten

3

Das scheint zu funktionieren, aber ich konnte den Cast bei der Berechnung des Repräsentanten nicht loswerden:

%Vor%

Übrigens: Seien Sie vorsichtig mit dem Anwendungsmerkmal, es ist zu Recht veraltet.

    
Landei 14.10.2010, 17:52
quelle
3

UPDATE: IntRing hinzugefügt, um Änderungen in trait Ring

zu verdeutlichen

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 :

%Vor%

Jetzt können Sie es wie folgt verwenden:

%Vor%     
Moritz 14.10.2010 11:38
quelle