I tipi non sono insiemi.
Vedete, la teoria degli insiemi ha una serie di caratteristiche che semplicemente non si applicano ai tipi e viceversa . Ad esempio, un oggetto ha un solo tipo canonico. Può essere un'istanza di diversi tipi diversi, ma solo uno di questi tipi è stato utilizzato per istanziarlo. La teoria degli insiemi non ha nozioni 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 generalmente non lo consente. Mentre la maggior parte delle lingue ha un Number
tipo o qualcosa di simile, non ne ha un EvenNumber
tipo, né sarebbe semplice crearne uno. Voglio dire, è abbastanza facile definire il tipo stesso, ma qualsiasi Number
s esistente che si presenta anche non verrà trasformata magicamente in EvenNumber
s.
In realtà, dire che è possibile "creare" sottoinsiemi è un po 'disonesto, perché gli insiemi sono un diverso tipo di animale. Nella teoria degli insiemi, questi sottoinsiemi esistono già , in tutti gli infiniti modi in cui puoi definirli. Nella teoria dei tipi, di solito ci aspettiamo 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 non possono contenere direttamente o indirettamente se stessi . Alcuni linguaggi, come Python, forniscono tipi con strutture meno regolari (in Python, type
il tipo canonico è type
ed object
è considerato un'istanza di object
). D'altra parte, la maggior parte delle lingue non consente ai tipi definiti dall'utente di impegnarsi in questo tipo di inganno.
Gli insiemi possono comunemente sovrapporsi senza essere contenuti l'uno nell'altro. Questo è raro nella teoria dei tipi, sebbene alcune lingue lo supportino sotto forma di eredità multipla. Altre lingue, come Java, consentono solo una forma limitata di questo o non lo consentono del tutto.
Il tipo vuoto esiste (si chiama il tipo in basso ), ma la maggior parte delle lingue non lo supporta o non lo considera un tipo di prima classe. Esiste anche il "tipo che contiene tutti gli altri tipi" (si chiama il tipo superiore ) ed è ampiamente supportato, diversamente dalla teoria degli insiemi.
NB : Come alcuni commentatori hanno precedentemente sottolineato (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 anziché modellare i tipi come set. Ma in pratica, questo è molto più semplice se usi la teoria delle categorie invece della teoria degli insiemi. Ecco come Haskell modella la sua teoria dei tipi, per esempio.
La nozione di "sottotipizzazione" è 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, sebbene alcune lingue (es. Go, Rust, probabilmente C) abbiano scelto quest'ultima per ragioni di convenienza, sia per il programmatore che per l'implementazione del linguaggio.
a
eb
sono membri di quel tipo, come menziona Killian Forth. Myclass è isomorfo per i record con campia
eb
di tipoint
edouble
- potresti prendere un record del genere e trasformarlo in un esempio dimyclass
.