Initial note:
This question got closed after several edits because I lacked the proper terminology to state accurately what I was looking for. Sam Tobin-Hochstadt then posted a comment which made me recognise exactly what that was: programming languages that support intersection types for function return values.
Now that the question has been re-opened, I've decided to improve it by rewriting it in a (hopefully) more precise manner. Therefore, some answers and comments below might no longer make sense because they refer to previous edits. (Please see the question's edit history in such cases.)
Ci sono dei popolari staticamente e amp; linguaggi di programmazione strongmente tipizzati (come Haskell, Java generico, C #, F #, ecc.) che supportano l'intersezione tipi per i valori di ritorno delle funzioni? Se sì, quali e come?
(Se sono onesto, mi piacerebbe molto vedere qualcuno dimostrare un modo come esprimere i tipi di intersezione in un linguaggio mainstream come C # o Java.)
Darò un rapido esempio di come potrebbero essere i tipi di intersezioni, 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 un certo tipo T
, di cui il chiamante sa solo che implementa le interfacce IX
e IY
. (Cioè, a differenza dei generici, il chiamante non può scegliere il tipo concreto di T
- la funzione lo fa. Da questo suppongo che T
non sia in effetti un tipo universale, ma un tipo esistenziale. )
P.S.: Sono consapevole che è possibile definire semplicemente interface IXY : IX, IY
e modificare il tipo di ritorno di fn
in IXY
. Tuttavia, non è proprio la stessa cosa, perché spesso non è possibile imbucare un'interfaccia aggiuntiva IXY
a un tipo precedentemente definito A
che implementa solo IX
e IY
separatamente.
Footnote: Some resources about intersection types:
Wikipedia article for "Type system" has a subsection about intersection types.
Report by Benjamin C. Pierce (1991), "Programming With Intersection Types, Union Types, and Polymorphism"
David P. Cunningham (2005), "Intersection types in practice", which contains a case study about the Forsythe language, which is mentioned in the Wikipedia article.
A Stack Overflow question, "Union types and intersection types" which got several good answers, among them this one which gives a pseudocode example of intersection types similar to mine above.