Je voudrais savoir si un type universellement quantifié : est un sous-type, ou cas particulier, de type existentiellement quantifié avec la même signature:
Je dirais "oui": si quelque chose est vrai "pour tous les X" ( pour tous les X ), alors cela doit aussi être vrai "pour certains X" ( ). Autrement dit, une instruction avec « » est simplement une version plus restreinte de la même instruction avec « »:
Ai-je tort quelque part?
Contexte: pourquoi est-ce que je demande cela?
J'étudie les types existentiels afin de comprendre pourquoi et comment les "types [de données] abstraits ont un type existentiel" . Je ne peux pas avoir une bonne compréhension de ce concept par la seule théorie; J'ai aussi besoin d'exemples concrets.
Malheureusement, il est difficile de trouver de bons exemples de code car la plupart des langages de programmation ne prennent en charge que peu de types existentiels. (Par exemple, les caractères génériques de Haskell
forall
ou Java?
.) D'un autre côté, les types universellement quantifiés sont pris en charge par de nombreux langages récents via des "génériques".Pire encore, les génériques semblent facilement se mélanger avec les types existentiels , ce qui rend encore plus difficile de distinguer les types existentiels des types universels. Je suis curieux de savoir pourquoi cette confusion se produit si facilement. Une réponse à cette question pourrait l'expliquer: si les types universels ne sont en effet qu'un cas particulier de types existentiels, il n'est pas étonnant que les types génériques, par exemple Java
List<T>
, puissent être interprétés dans un sens ou dans l'autre.
forall x. P(x)
alors exists x. P(x)
. Si les systèmes de types en tiennent compte lors de la vérification des types ... Je n'en ai aucune idée. +1 pour une question intéressante.