Union-Typen als gebunden für Typparameter eines Merkmals (Scala)

8

Wie kann ich festlegen, dass die Typparameter eines Merkmals zu einer bestimmten Menge von Typen gehören (z. B. gebunden an Union-Typ)?

Als konkretes Beispiel möchte ich ein Merkmal IntegralIndex[T] erstellen, wobei T muss Int oder Long .

Ich habe die erste Antwort auf diese Frage zu den Union-Typen ausprobiert :

%Vor%

aber das funktioniert nicht; Ich bekomme traits cannot have type parameters with context bounds ': ...' nor view bounds '<% ...'

Irgendwelche anderen Vorschläge? Zugegebenermaßen habe ich die anderen Lösungen zu der Frage nach Unionstypen nicht verstanden, daher würde ich es begrüßen, wenn die Antwort darin besteht, nur eine andere Antwort zu verwenden oder zu wissen, dass dies nicht möglich ist.

    
Imran Rashid 31.01.2013, 08:12
quelle

1 Antwort

6

Der Typklassenansatz ist wahrscheinlich der sauberste Weg, um das zu erreichen, was Sie hier wollen, und Sie sind mit Ihrer Version auf dem richtigen Weg. Es funktioniert nicht in seiner aktuellen Form, weil Kontextgrenzen nur syntaktischer Zucker für implizite Parameter sind. Die folgende Merkmalsdefinition, zum Beispiel:

%Vor%

würde zu etwas wie diesem entzuckert werden:

%Vor%

Aber Eigenschaften haben keine Konstruktoren, daher ist dies keine gültige Scala-Syntax. Sie können jedoch etwas wie folgt schreiben:

%Vor%

Dies stellt sicher, dass Sie kein IntegralIndex[T] erstellen können, es sei denn, Sie haben Beweise, dass es eine Instanz der NumericIndex type-Klasse für T gibt.

Wenn Sie jetzt IntegralIndex implementieren, schreiben Sie entweder:

%Vor%

Oder:

%Vor%

Nun sind alle impliziten Installationen für jeden, der MyIndex verwendet, unsichtbar.

    
Travis Brown 31.01.2013, 11:36
quelle

Tags und Links