Note initiale:
Cette question a été fermée après plusieurs modifications car je n'avais pas la terminologie appropriée pour énoncer avec précision ce que je cherchais. Sam Tobin-Hochstadt a ensuite posté un commentaire qui m'a fait reconnaître exactement ce que c'était: des langages de programmation qui prennent en charge les types d'intersection pour les valeurs de retour de fonction.
Maintenant que la question a été rouverte, j'ai décidé de l'améliorer en la réécrivant d'une manière (je l'espère) plus précise. Par conséquent, certaines réponses et commentaires ci-dessous peuvent ne plus avoir de sens car ils font référence à des modifications précédentes. (Veuillez consulter l'historique des modifications de la question dans de tels cas.)
Existe-t-il des langages de programmation populaires et fortement typés (tels que Haskell, Java générique, C #, F #, etc.) qui prennent en charge les types d'intersection pour les valeurs de retour de fonction? Si oui, lequel et comment?
(Si je suis honnête, j'aimerais vraiment voir quelqu'un montrer comment exprimer les types d'intersection dans un langage courant comme C # ou Java.)
Je vais donner un rapide exemple de ce à quoi pourraient ressembler les types d'intersection, en utilisant un pseudocode similaire à 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();
}
Autrement dit, la fonction fn
retourne une instance d'un certain type T
, dont l'appelant sait seulement qu'il implémente des interfaces IX
et IY
. (C'est-à-dire que, contrairement aux génériques, l'appelant ne peut pas choisir le type concret de T
- la fonction le fait. De cela, je suppose que ce T
n'est en fait pas un type universel, mais un type existentiel.)
PS: Je suis conscient que l'on pourrait simplement définir un interface IXY : IX, IY
et changer le type de retour de fn
en IXY
. Cependant, ce n'est pas vraiment la même chose, car souvent vous ne pouvez pas boulonner une interface supplémentaire IXY
à un type précédemment défini A
qui implémente uniquement IX
et IY
séparément.
Note de bas de page: Quelques ressources sur les types d'intersection:
L'article de Wikipedia pour "Type system" contient une sous - section sur les types d'intersection .
Rapport de Benjamin C. Pierce (1991), "Programmation avec les types d'intersection, les types d'union et le polymorphisme"
David P. Cunningham (2005), "Intersection types in practice" , qui contient une étude de cas sur le langage de Forsythe, qui est mentionnée dans l'article Wikipedia.
Une question Stack Overflow, "Union types and intersection types" qui a obtenu plusieurs bonnes réponses, dont celle-ci qui donne un exemple pseudocode de types d'intersection similaires au mien ci-dessus.
T
comme interface I
quand il implémente toutes les méthodes de l'interface, mais n'a pas déclaré cette interface".
T
définit un type, même s'il est juste défini dans la déclaration de fonction comme "un type qui étend / implémenteIX
etIY
". Le fait que la réelle valeur de retour est un cas particulier de ce (A
ouB
respectivement) ne sont pas quelque chose de spécial ici, vous pourriez tout aussi bien y parvenir en utilisant auObject
lieu deT
.