Questa è una bella domanda! Chiede cosa ci aspettiamo dai tipi in una lingua tipizzata.
Prima nota che possiamo digitare qualsiasi linguaggio di programmazione con l' unità : basta scegliere una lettera, dire U
e dire che ogni programma ha tipo U
. Questo non è terribilmente utile, ma fa un punto.
eAeAAint
Non c'è limite a quanto possano essere espressivi i tuoi tipi. In linea di principio potrebbero essere qualsiasi tipo di affermazioni logiche, potrebbero usare la teoria delle categorie e quant'altro, ecc. Ad esempio, i tipi dipendenti ti permetteranno di esprimere cose come "questa funzione mappa elenchi in modo tale che l'output sia un input ordinato". Puoi andare oltre, al momento sto ascoltando un discorso su "logiche di separazione simultanee" che ti permette di parlare di come i programmi simultanei funzionano con lo stato condiviso. Roba di fantasia.
L'arte dei tipi nella progettazione del linguaggio di programmazione è quella di bilanciare espressività e semplicità :
- tipi più espressivi ci consentono di spiegare in modo più dettagliato (a noi stessi e al compilatore) cosa dovrebbe succedere
- i tipi più semplici sono più facili da capire e possono essere automatizzati più facilmente nel compilatore. (Le persone escono con tipi che essenzialmente richiedono un assistente di prova e l'input dell'utente per eseguire il controllo del tipo.)
La semplicità non è da sottovalutare, poiché non tutti i programmatori hanno un dottorato in teoria dei linguaggi di programmazione.
Quindi torniamo alla tua domanda: come fai a sapere che il tuo sistema di tipi è buono ? Bene, dimostra i teoremi che mostrano che i tuoi tipi sono bilanciati. Ci saranno due tipi di teoremi:
Teoremi che dicono che i tuoi tipi sono utili . Sapere che un programma ha un tipo dovrebbe implicare alcune garanzie, ad esempio che il programma non si blocchi (sarebbe un teorema di sicurezza ). Un'altra famiglia di teoremi collegherebbe i tipi a modelli semantici in modo che possiamo iniziare a usare la matematica reale per provare cose sui nostri programmi (quelli sarebbero i teoremi di adeguatezza e molti altri). L'unità di cui sopra è cattiva perché non ha teoremi così utili.
Teoremi che affermano che i tuoi tipi sono semplici . Uno di base sarebbe che è decidibile se una determinata espressione ha un determinato tipo. Un'altra caratteristica di semplicità è quella di fornire un algoritmo per inferire un tipo. Altri teoremi sulla semplicità sarebbero: che un'espressione ha al massimo un tipo, o che un'espressione ha un tipo principale (cioè, il "migliore" tra tutti i tipi che ha).
È difficile essere più specifici perché i tipi sono un meccanismo molto generale. Ma spero che vedrai per cosa dovresti sparare. Come la maggior parte degli aspetti della progettazione del linguaggio di programmazione, non esiste una misura assoluta di successo. Invece, c'è uno spazio di possibilità progettuali e l'importante è capire dove sei o vuoi essere nello spazio.