Nota iniziale:
Questa domanda è stata chiusa dopo varie modifiche perché mancava della terminologia corretta per affermare con precisione ciò che stavo cercando. Sam Tobin-Hochstadt ha quindi pubblicato un commento che mi ha fatto riconoscere esattamente quello che era: linguaggi di programmazione che supportano i tipi di intersezione per i valori di ritorno della funzione.
Ora che la domanda è stata riaperta, ho deciso di migliorarla riscrivendola in modo (si spera) più preciso. Pertanto, alcune risposte e commenti di seguito potrebbero non avere più senso in quanto si riferiscono a modifiche precedenti. (In questi casi, consultare la cronologia delle modifiche della domanda.)
Esistono linguaggi di programmazione popolari staticamente e fortemente tipizzati (come Haskell, Java generico, C #, F #, ecc.) Che supportano i tipi di intersezione per i valori di ritorno della funzione? In caso affermativo, quale e come?
(Se sono onesto, mi piacerebbe davvero vedere qualcuno dimostrare un modo per esprimere i tipi di intersezione in un linguaggio tradizionale come C # o Java.)
Darò un rapido esempio di come potrebbero apparire i tipi di intersezione, usando alcuni pseudocodici simili a C #:
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();
}
Cioè, la funzione fn
restituisce un'istanza di qualche tipo T
, di cui il chiamante sa solo che implementa interfacce IX
e IY
. (Cioè, a differenza dei generici, il chiamante non riesce a scegliere il tipo concreto di T
- la funzione lo fa. Da questo suppongo che T
in realtà non sia un tipo universale, ma un tipo esistenziale.)
PS: Sono consapevole che si potrebbe semplicemente definire un interface IXY : IX, IY
e cambiare il tipo di ritorno di fn
in IXY
. Tuttavia, non è proprio la stessa cosa, perché spesso non è possibile fissare un'interfaccia aggiuntiva IXY
a un tipo precedentemente definito A
che implementa solo IX
e IY
separatamente.
Nota a piè di pagina: alcune risorse sui tipi di intersezione:
L'articolo di Wikipedia per "Tipo di sistema" contiene una sottosezione relativa ai tipi di intersezione .
Rapporto di Benjamin C. Pierce (1991), "Programmazione con tipi di intersezione, tipi di unione e polimorfismo"
David P. Cunningham (2005), "Tipi di intersezione in pratica" , che contiene un caso di studio sul linguaggio Forsythe, che è menzionato nell'articolo di Wikipedia.
Una domanda Stack Overflow, "Tipi di unione e tipi di intersezione" che ha ottenuto diverse risposte valide, tra cui questa che fornisce un esempio di pseudocodice di tipi di intersezione simili ai miei sopra.
T
come interfaccia I
quando implementa tutti i metodi dell'interfaccia, ma non ha dichiarato tale interfaccia".
T
definisce un tipo, anche se è appena definito nella dichiarazione di funzione come "un tipo che estende / implementaIX
eIY
". Il fatto che il valore di ritorno effettivo sia un caso speciale di quello (A
oB
rispettivamente) non è qualcosa di speciale qui, si potrebbe anche ottenere ciò usandoObject
invece diT
.