Anfangshinweis:
Diese Frage wurde nach mehreren Änderungen geschlossen, da mir die richtige Terminologie fehlte, um genau zu sagen, wonach ich suchte. Sam Tobin-Hochstadt hat dann einen Kommentar gepostet, der mich genau erkennen ließ, was das war: Programmiersprachen, die Schnittpunkttypen für Funktionsrückgabewerte unterstützen.
Nachdem die Frage erneut geöffnet wurde, habe ich beschlossen, sie zu verbessern, indem ich sie (hoffentlich) genauer umschreibe. Aus diesem Grund sind einige der folgenden Antworten und Kommentare möglicherweise nicht mehr sinnvoll, da sie sich auf frühere Änderungen beziehen. (Bitte lesen Sie in solchen Fällen den Bearbeitungsverlauf der Frage.)
Gibt es beliebte statisch und stark typisierte Programmiersprachen (wie Haskell, generisches Java, C #, F # usw.), die Schnittpunkttypen für Funktionsrückgabewerte unterstützen? Wenn ja, welche und wie?
(Wenn ich ehrlich bin, würde ich wirklich gerne jemanden sehen, der demonstriert, wie Schnittstellentypen in einer gängigen Sprache wie C # oder Java ausgedrückt werden können.)
Ich werde ein kurzes Beispiel dafür geben, wie Schnittpunkttypen mit einem Pseudocode ähnlich C # aussehen könnten:
interface IX { … }
interface IY { … }
interface IB { … }
class A : IX, IY { … }
class B : IX, IY, IB { … }
T fn() where T : IX, IY
{
return … ? new A()
: new B();
}
Das heißt, die Funktion fn
gibt eine Instanz eines Typs zurück T
, von der der Aufrufer nur weiß, dass sie Interfaces IX
und implementiert IY
. (Das heißt, im Gegensatz zu Generika kann der Aufrufer nicht den konkreten Typ auswählen , sondern T
die Funktion. Ich würde davon ausgehen, dass T
es sich in der Tat nicht um einen universellen Typ, sondern um einen existenziellen Typ handelt.)
PS: Mir ist bewusst, dass man einfach eine definieren interface IXY : IX, IY
und den Rückgabetyp von fn
auf ändern könnte IXY
. Dies ist jedoch nicht das gleiche, da Sie eine zusätzliche Schnittstelle häufig nicht IXY
an einen zuvor definierten Typ anschrauben können, A
der nur implementiert IX
und IY
separat ist.
Fußnote: Einige Ressourcen zu Schnittpunkttypen:
Wikipedia-Artikel für "Typensystem" enthält einen Unterabschnitt über Schnittpunkttypen .
Bericht von Benjamin C. Pierce (1991), "Programmieren mit Schnitttypen, Unionstypen und Polymorphismus"
David P. Cunningham (2005), "Intersection types in practice" , der eine Fallstudie über die Forsythe-Sprache enthält, die im Wikipedia-Artikel erwähnt wird.
Eine Stapelüberlauf-Frage, "Verbindungstypen und Kreuzungstypen", die mehrere gute Antworten erhielt, darunter diese, die ein Pseudocode-Beispiel für Kreuzungstypen ähnlich der oben genannten gibt.
T
als Schnittstelle behandelt werden, I
wenn alle Methoden der Schnittstelle implementiert werden, diese Schnittstelle wurde jedoch nicht deklariert".
T
definiert einen Typ, auch wenn er nur in der Funktionsdeklaration als "ein Typ, der erweitert / implementiertIX
undIY
" definiert ist. Die Tatsache, dass der tatsächliche Rückgabewert ein Sonderfall davon ist (A
bzw. istB
), ist hier nichts Besonderes. Sie können dies auch erreichen, indem SieObject
anstelle von verwendenT
.