Les types ne sont pas des ensembles.
Vous voyez, la théorie des ensembles a un certain nombre de fonctionnalités qui ne s'appliquent tout simplement pas aux types, et vice-versa . Par exemple, un objet a un seul type canonique. Il peut s'agir d'une instance de plusieurs types différents, mais un seul de ces types a été utilisé pour l'instancier. La théorie des ensembles n'a aucune notion d'ensembles "canoniques".
La théorie des ensembles vous permet de créer des sous-ensembles à la volée , si vous avez une règle qui décrit ce qui appartient au sous-ensemble. La théorie des types ne le permet généralement pas. Alors que la plupart des langues ont un Number
type ou quelque chose de similaire, elles n'en ont pasEvenNumber
et il ne serait pas simple d'en créer un. Je veux dire, il est assez facile de définir le type lui-même, mais tout Number
s existant qui se trouve même ne sera pas magiquement transformé en EvenNumber
s.
En fait, dire que vous pouvez "créer" des sous-ensembles est quelque peu fallacieux, car les ensembles sont un tout autre type d'animal. Dans la théorie des ensembles, ces sous-ensembles existent déjà , de toutes les façons infinies que vous pouvez les définir. Dans la théorie des types, nous nous attendons généralement à traiter un nombre fini (s'il est grand) de types à un moment donné. Les seuls types qui existeraient sont ceux que nous avons réellement définis, pas tous les types que nous pourrions éventuellement définir.
Les ensembles ne sont pas autorisés à se contenir directement ou indirectement . Certains langages, tels que Python, fournissent des types avec des structures moins régulières (en Python, type
le type canonique de est type
et object
est considéré comme une instance de object
). D'un autre côté, la plupart des langues ne permettent pas aux types définis par l'utilisateur de s'engager dans ce genre de tromperie.
Les ensembles sont généralement autorisés à se chevaucher sans être contenus les uns dans les autres. Ceci est rare dans la théorie des types, bien que certains langages le prennent en charge sous forme d'héritage multiple. D'autres langages, tels que Java, n'autorisent qu'une forme restreinte de cela ou l'interdisent entièrement.
Le type vide existe (il est appelé le type inférieur ), mais la plupart des langues ne le prennent pas en charge ou ne le considèrent pas comme un type de première classe. Le "type qui contient tous les autres types" existe également (il est appelé le type supérieur ) et est largement pris en charge, contrairement à la théorie des ensembles.
NB : Comme certains commentateurs l'ont souligné précédemment (avant que le thread ne soit déplacé vers le chat), il est possible de modéliser des types avec la théorie des ensembles et d'autres constructions mathématiques standard. Par exemple, vous pouvez modéliser l'appartenance à un type sous forme de relation plutôt que modéliser des types sous forme d'ensembles. Mais en pratique, c'est beaucoup plus simple si vous utilisez la théorie des catégories au lieu de la théorie des ensembles. C'est ainsi que Haskell modélise sa théorie des types, par exemple.
La notion de "sous-typage" est vraiment très différente de la notion de "sous-ensemble". Si X
est un sous-type de Y
, cela signifie que nous pouvons remplacer des instances de Y
par des instances de X
et le programme "fonctionnera" dans un certain sens. C'est comportemental plutôt que structurel, bien que certains langages (par exemple Go, Rust, sans doute C) aient choisi ce dernier pour des raisons de commodité, soit pour le programmeur soit pour l'implémentation du langage.
a
et neb
sont pas membres de ce type, comme le mentionne Killian Forth. Myclass est isomorphe aux enregistrements avec des champsa
etb
de typeint
etdouble
- vous pouvez prendre un enregistrement comme celui-ci et le transformer en une instance demyclass
.