Los tipos no son conjuntos.
Verá, la teoría de conjuntos tiene una serie de características que simplemente no se aplican a los tipos, y viceversa . Por ejemplo, un objeto tiene un solo tipo canónico. Puede ser una instancia de varios tipos diferentes, pero solo se usó uno de esos tipos para crear una instancia. La teoría de conjuntos no tiene noción de conjuntos "canónicos".
La teoría de conjuntos le permite crear subconjuntos sobre la marcha , si tiene una regla que describe lo que pertenece al subconjunto. La teoría de tipos generalmente no permite esto. Si bien la mayoría de los idiomas tienen un Number
tipo o algo similar, no tienen un EvenNumber
tipo, ni sería sencillo crear uno. Quiero decir, es bastante fácil definir el tipo en sí, pero cualquier Number
s existente que sea incluso no se transformará mágicamente en EvenNumber
s.
En realidad, decir que puedes "crear" subconjuntos es algo falso, porque los conjuntos son un tipo completamente diferente de animal. En la teoría de conjuntos, esos subconjuntos ya existen , en todas las infinitas formas en que puede definirlos. En la teoría de tipos, generalmente esperamos tratar con un número finito (si es grande) de tipos en un momento dado. Los únicos tipos que se dice que existen son los que hemos definido, no todos los tipos que podríamos definir.
Los conjuntos se no se les permite contener directa o indirectamente a sí mismos . Algunos lenguajes, como Python, proporcionan tipos con estructuras menos regulares (en Python, type
el tipo canónico es type
, y object
se considera una instancia de object
). Por otro lado, la mayoría de los idiomas no permiten que los tipos definidos por el usuario participen en este tipo de trucos.
Los conjuntos suelen superponerse sin estar contenidos entre sí. Esto es poco común en la teoría de tipos, aunque algunos lenguajes lo admiten en forma de herencia múltiple. Otros lenguajes, como Java, solo permiten una forma restringida de esto o no lo permiten por completo.
El tipo vacío existe (se llama el tipo inferior ), pero la mayoría de los idiomas no lo admiten o no lo consideran un tipo de primera clase. El "tipo que contiene todos los demás tipos" también existe (se llama el tipo superior ) y es ampliamente compatible, a diferencia de la teoría de conjuntos.
NB : Como algunos comentaristas señalaron anteriormente (antes de que el hilo se moviera al chat), es posible modelar tipos con teoría de conjuntos y otras construcciones matemáticas estándar. Por ejemplo, podría modelar la membresía de tipo como una relación en lugar de modelar tipos como conjuntos. Pero en la práctica, esto es mucho más simple si usa la teoría de categorías en lugar de la teoría de conjuntos. Así es como Haskell modela su teoría de tipos, por ejemplo.
La noción de "subtipo" es realmente muy diferente de la noción de "subconjunto". Si X
es un subtipo de Y
, significa que podemos sustituir instancias de Y
instancias de X
y el programa seguirá "funcionando" en algún sentido. Esto es más conductual que estructural, aunque algunos lenguajes (por ejemplo, Go, Rust, posiblemente C) han elegido este último por razones de conveniencia, ya sea para el programador o la implementación del lenguaje.
a
yb
son miembros de ese tipo, como menciona Killian Forth. Myclass es isomorfo a registros con camposa
yb
de tipoint
ydouble
- podría tomar un registro como ese y convertirlo en una instancia demyclass
.