Ist es möglich, einen gemeinsamen Supertyp auf Typ-System-Ebene in Scala zu finden?

8

Ist es möglich, in Scala einen Typ-Alias ​​(oder etwas Äquivalentes) zu erstellen, der zwei Parameter akzeptiert und ihren gemeinsamen Supertyp zurückgibt? Mit anderen Worten, ich versuche etwas mit dieser Signatur zu finden:

%Vor%

wo diese gelten: (Pseudocode)

%Vor%

usw.

Ich konnte es nicht selbst finden, aber ich kann keine Alternativen wie das Hinzufügen eines zusätzlichen Parameters verwenden, da ich einer vorgegebenen Schnittstelle folgen muss.

    
Anonymous 04.11.2011, 20:24
quelle

3 Antworten

3

(Keine vollständige Lösung, aber vielleicht ein paar Ideen)

Ein beeindruckendes Merkmal von Scala ist seine Fähigkeit, eine Liste von Früchten zurückzugeben, wenn eine Orange an eine Liste von Äpfeln angehängt wird. Es ist in Ordnung mit Werten, gerade weil Sie den generischen Typ ableiten lassen.

%Vor%

Es funktioniert (irgendwie):

%Vor%

Der nächste Schritt wäre, diesen Trick zu höheren Klassen zu heben (nicht getestet).
Eine halbgebackene Lösung besteht darin, Werte aus Typen zu erstellen (siehe diese Antwort ):

%Vor%

Aber ich stecke in dieser nicht intuitiven Inkonsistenz fest:

%Vor%

Jedenfalls mag ich diese Art von Fragen (Fragen über Typen), hier riecht es nach einem XY Problem .

    
YvesgereY 11.11.2011 00:57
quelle
2

Ich kann dir eine Eigenschaft CommonSupertype[A, B] und eine implizite Generatorfunktion geben, so dass du einfach eine implizite Instanz dieser Eigenschaft benötigst, wo immer du sie brauchst, und sie wird den allgemeinen Supertyp (als abhängigen Typ) enthalten.

Das ist nicht meine Idee, es ist tatsächlich so leicht von angepasst Beitrag von Miles Sabin .

Die einzige Änderung, die ich vorgenommen habe, ist, dass, während er ¬¬[C] <:< (A ∨ B) als Beweis dafür verwendet, dass ein Typ C ein Subtyp von A oder B ist, ich die Richtung der Subtypisierung umgekehrt habe (also: (A ∨ B) <:< ¬¬[C] ) überprüfe, ob A und B Untertypen von C sind.

%Vor%

Gibt uns:

%Vor%     
Dan 10.12.2014 15:09
quelle
1

Sie können typeTag des am wenigsten verbreiteten Supertyps erhalten und dann dessen Typ extrahieren (siehe Wie erfasse ich T von TypeTag [T] oder einem anderen generischen Objekt in scala? )

%Vor%

Verwendung

%Vor%

Für isInstanceOf Wie kann man wissen, ob ein Objekt eine Instanz eines TypeTags ist?

Die einzige Einschränkung besteht darin, dass Sie keinen allgemeinen Typ von Typparametern erhalten können - er wird immer in Any gelöscht.

    
dk14 26.09.2014 04:38
quelle

Tags und Links