Perché ciò che è alla destra dei due punti non è necessariamente un insieme e ciò che è alla sinistra dei due punti non è necessariamente un membro di quell'insieme.
La teoria dei tipi è nata all'inizio del XX secolo come approccio alla fondazione della matematica. Bertrand Russel scoprì un paradosso nella teoria degli insiemi ingenui e lavorò sulla teoria dei tipi come un modo per limitare il potere espressivo della teoria degli insiemi per evitare questo (e qualsiasi altro) paradosso. Nel corso degli anni, Russel e altri hanno definito molte teorie di tipi. In alcune teorie dei tipi, i tipi sono insiemi con determinate proprietà, ma in altri sono un diverso tipo di bestia.
In particolare, molte teorie dei tipi hanno una formulazione sintattica . Ci sono regole che fanno sì che una cosa abbia un tipo. Quando le regole di battitura utilizzate come base per una teoria, è importante distinguere cosa dicono le regole di battitura da ciò che si potrebbe dedurre applicando ulteriori conoscenze esterne. Ciò è particolarmente importante se le regole di battitura sono alla base di una teoria della dimostrazione: i teoremi che si basano sulla teoria degli insiemi con la logica classica e l'assioma della scelta possono o meno contenere una logica costruttiva, per esempio. Uno dei documenti fondamentali in questo settore è Church 's A Formulation of the Simple Theory of Types (1940)
Forse il modo in cui la distinzione tra tipi e set è più evidente è che la regola più semplice per gli insiemi, vale a dire che due insiemi sono uguali se hanno gli stessi elementi, di solito non si applica ai tipi. Vedi la risposta di Andrej Bauer qui e la sua risposta su una domanda correlata per alcuni esempi. Quel secondo thread ha altre risposte che vale la pena leggere.
In un calcolo tipizzato, dire che i tipi sono insiemi significa in effetti dare una semantica ai tipi. Dare a un calcolo una semantica di tipo teorico non è banale. Ad esempio, supponiamo di definire una lingua con funzioni. Che set è un tipo di funzione? Le funzioni totali sono determinate dal loro grafico, come ci viene insegnato nella teoria degli insiemi 101. Ma che dire delle funzioni parziali? Vuoi dare a tutte le funzioni non terminanti la stessa semantica? Non è possibile interpretare i tipi come set per un calcolo che consente funzioni ricorsive fino a quando non si risponde a tale domanda. Dare una semantica denotazionale ai linguaggi di programmazione o ai calcoli era un problema difficile nei primi anni '70. L'articolo fondamentale qui è Verso una semantica matematica per linguaggi informatici (1971) diDana Scott e Christopher Strachey . Il wikibook di Haskell ha una buona presentazione dell'argomento.
Come ho scritto sopra, una seconda parte della risposta è che anche se sei riuscito a dare ai tipi una semantica teorica set, la cosa a sinistra dei due punti non è sempre un elemento dell'insieme. I valori hanno tipi, ma anche altre cose, come espressioni e variabili . Ad esempio, un'espressione in un linguaggio di programmazione tipizzato ha un tipo anche se non termina. Potresti voler confondere integer
e , ma non è un elemento di .ZZ(x := 0; while true; do x := x + 1; x)
Z
Non so quando è nata la notazione del colon per i tipi. Ora è standard nella semantica e comune nei linguaggi di programmazione, ma né Russel né Church lo hanno usato. L'Algol non lo usò, ma il linguaggio fortemente ispirato all'Algol Pascal nel 1971. Sospetto che non sia stato il primo, però, perché molti documenti teorici dei primi anni '70 usano la notazione, ma non conosco un uso precedente. È interessante notare che questo è stato subito dopo l'unificazione dei concetti di tipi dalla programmazione e dalla logica - come mostra Simon Martini in Diversi tipi di tipi nei linguaggi di programmazione , quello che era chiamato un "tipo" nei linguaggi di programmazione fino agli anni '60 veniva dal volgare uso della parola e non dalla teoria dei tipi.