Tipos não são conjuntos.
Veja bem, a teoria dos conjuntos tem vários recursos que simplesmente não se aplicam aos tipos e vice-versa . Por exemplo, um objeto tem um único tipo canônico. Pode ser uma instância de vários tipos diferentes, mas apenas um desses tipos foi usado para instanciar. A teoria dos conjuntos não tem noção de conjuntos "canônicos".
A teoria dos conjuntos permite criar subconjuntos em tempo real , se você tiver uma regra que descreva o que pertence ao subconjunto. A teoria dos tipos geralmente não permite isso. Embora a maioria dos idiomas tenha um Number
tipo ou algo semelhante, eles não têm um EvenNumber
tipo, nem seria fácil criar um. Quero dizer, é fácil definir o tipo em si, mas quaisquer Number
s existentes que sejam pares não serão magicamente transformados em EvenNumber
s.
Na verdade, dizer que você pode "criar" subconjuntos é um tanto falso, porque conjuntos são um tipo diferente de animal. Na teoria dos conjuntos, esses subconjuntos já existem , de todas as maneiras infinitas que você pode defini-los. Na teoria dos tipos, geralmente esperamos lidar com um número finito (se grande) de tipos a qualquer momento. Os únicos tipos que dizem existir são aqueles que realmente definimos, e não todos os tipos que poderíamos definir.
Os conjuntos não têm permissão para se conter direta ou indiretamente . Algumas linguagens, como Python, fornecem tipos com estruturas menos regulares (no Python, type
o tipo canônico é type
e object
é considerado uma instância de object
). Por outro lado, a maioria dos idiomas não permite que tipos definidos pelo usuário se envolvam nesse tipo de truque.
Geralmente, os conjuntos podem se sobrepor sem estar contidos um no outro. Isso é incomum na teoria dos tipos, embora algumas linguagens a suportem na forma de herança múltipla. Outras linguagens, como Java, apenas permitem uma forma restrita disso ou o proíbem totalmente.
O tipo vazio existe (é chamado de tipo inferior ), mas a maioria dos idiomas não o suporta ou não o considera como um tipo de primeira classe. O "tipo que contém todos os outros tipos" também existe (é chamado de tipo superior ) e é amplamente suportado, diferentemente da teoria dos conjuntos.
NB : Como alguns comentadores apontaram anteriormente (antes da discussão do tópico), é possível modelar tipos com teoria dos conjuntos e outras construções matemáticas padrão. Por exemplo, você pode modelar a associação de tipo como uma relação, em vez de modelar tipos como conjuntos. Mas, na prática, isso é muito mais simples se você usar a teoria das categorias em vez da teoria dos conjuntos. É assim que Haskell modela sua teoria de tipos, por exemplo.
A noção de "subtipagem" é realmente bem diferente da noção de "subconjunto". Se X
for um subtipo de Y
, significa que podemos substituir instâncias de Y
por instâncias de X
e o programa ainda "funcionará" em algum sentido. Isso é comportamental e não estrutural, embora algumas linguagens (por exemplo, Go, Rust, sem dúvida C) tenham escolhido a última por razões de conveniência, seja para o programador ou para a implementação da linguagem.
a
eb
são membros desse tipo, como menciona Killian Forth.Myclass é isomórfico para registros com camposa
eb
do tipoint
edouble
- você pode pegar um registro como esse e transformá-lo em uma instância demyclass
.