I tipi non sono set.
Come vedi, la teoria degli insiemi ha un numero di caratteristiche che semplicemente non si applicano ai tipi, e vice-versa . Ad esempio, un oggetto ha un singolo tipo canonico. Può essere un'istanza di diversi tipi, ma solo uno di questi tipi è stato utilizzato per istanziarlo. La teoria degli insiemi non ha la nozione di insiemi "canonici".
La teoria degli insiemi ti consente di creare sottoinsiemi al volo , se hai una regola che descrive ciò che appartiene al sottoinsieme . La teoria dei tipi in genere non lo consente. Mentre molte lingue hanno un tipo Number
o qualcosa di simile, non hanno un tipo EvenNumber
, né sarebbe semplice crearne uno. Voglio dire, è abbastanza facile definire il tipo stesso, ma qualsiasi Number
s esistente che capita di essere anche non sarà magicamente trasformato in EvenNumber
s.
In realtà, dire che è possibile "creare" sottoinsiemi è in qualche modo disonesto, perché gli insiemi sono un tipo di animale completamente diverso. Nella teoria degli insiemi, quei sottoinsiemi esistono già , in tutti i modi infiniti in cui è possibile definirli. Nella teoria dei tipi, di solito ci si aspetta di avere a che fare con un numero finito (se grande) di tipi in un dato momento. Gli unici tipi che si dice esistano sono quelli che abbiamo effettivamente definito, non tutti i tipi che potremmo definire.
Gli insiemi sono non autorizzati a contenere se stessi direttamente o indirettamente . Alcuni linguaggi, come Python, forniscono tipi con strutture meno regolari (in Python, il tipo canonico di type
è type
e object
è considerato un'istanza di object
). D'altra parte, la maggior parte delle lingue non consente tipi definiti dall'utente per ingannare questo tipo di inganno.
È comunemente permesso che gli insiemi si sovrappongano senza essere contenuti l'uno nell'altro. Questo è raro nella teoria dei tipi, sebbene alcuni linguaggi lo supportino sotto forma di ereditarietà multipla. Altri linguaggi, come Java, consentono solo una forma limitata di questo o non lo consentono completamente.
Il tipo vuoto esiste (si chiama tipo di fondo ), ma la maggior parte delle lingue non lo supporta, o no considerarlo come un tipo di prima classe. Esiste anche il "tipo che contiene tutti gli altri tipi" (si chiama top type ) ed è ampiamente supportato, a differenza della teoria degli insiemi .
NB : come alcuni commentatori hanno precedentemente indicato (prima che il thread fosse spostato in chat), è possibile modellare i tipi con la teoria degli insiemi e altri costrutti matematici standard. Ad esempio, è possibile modellare l'appartenenza al tipo come relazione piuttosto che i tipi di modelli come insiemi. Ma in pratica, questo è molto più semplice se usi la teoria delle categorie invece della teoria degli insiemi. Questo è il modo in cui Haskell modella la sua teoria del tipo, per esempio.
La nozione di "sottotipizzazione" è in realtà molto diversa dalla nozione di "sottoinsieme". Se X
è un sottotipo di Y
, significa che possiamo sostituire istanze di Y
per istanze di X
e il programma continuerà a "funzionare" in un certo senso. Questo è comportamentale piuttosto che strutturale, anche se alcuni linguaggi (ad esempio Go, Rust, probabilmente C) hanno scelto quest'ultimo per ragioni di convenienza, sia per il programmatore che per l'implementazione del linguaggio.