I sistemi di tipi evitano errori
I sistemi di tipo eliminano i programmi illegali. Considera il seguente codice Python.
a = 'foo'
b = True
c = a / b
In Python, questo programma fallisce; lancia un'eccezione. In un linguaggio come Java, C #, Haskell , qualunque cosa, questo non è nemmeno un programma legale. Evitate completamente questi errori perché semplicemente non sono possibili nel set di programmi di input.
Allo stesso modo, un sistema di tipo migliore esclude più errori. Se passiamo a sistemi di tipo super avanzati possiamo dire cose del genere:
Definition divide x (y : {x : integer | x /= 0}) = x / y
Ora il sistema di tipi garantisce che non vi siano errori di divisione per 0.
Che tipo di errori
Ecco un breve elenco di ciò che gli errori possono impedire ai sistemi di tipo
- Errori fuori range
- Iniezione SQL
- Generalizzazione di 2, molti problemi di sicurezza (quali controllo dell'inquinamento si trovano in Perl )
- Errori fuori sequenza (dimenticando di chiamare init)
- Forzare un sottoinsieme di valori da utilizzare (ad esempio, solo numeri interi maggiori di 0)
-
Nefarious kittens (Sì, era uno scherzo)
- Errori di perdita di precisione
-
Errori di memoria transazionale software (STM) (questo richiede purezza, che richiede anche tipi)
- Generalizzazione di 8, controllo degli effetti collaterali
- Invarianti su strutture dati (è un albero binario bilanciato?)
- Dimentica un'eccezione o lancia quella sbagliata
E ricorda, questo è anche al momento compilazione . Non è necessario scrivere test con copertura del 100% del codice per controllare semplicemente gli errori di tipo, il compilatore lo fa per te:)
Case study: calcolo lambda tipizzato
Bene, esaminiamo il più semplice dei sistemi di tutti i tipi, semplicemente calcolo lambda tipizzato .
Fondamentalmente ci sono due tipi,
Type = Unit | Type -> Type
E tutti i termini sono variabili, lambda o applicazione. Sulla base di questo, possiamo dimostrare che qualsiasi programma ben scritto termina. Non c'è mai una situazione in cui il programma si bloccherà o si interromperà per sempre. Questo non è dimostrabile nel normale calcolo lambda perché, beh, non è vero.
Pensa a questo, possiamo usare i sistemi di tipi per garantire che il nostro programma non si interrompa per sempre, piuttosto bello vero?
Deviazione in tipi dinamici
I sistemi di tipi dinamici possono offrire garanzie identiche come sistemi di tipo statico, ma in fase di esecuzione anziché in fase di compilazione. In realtà, dal momento che è runtime, puoi effettivamente offrire più informazioni. Tuttavia, si perdono alcune garanzie, in particolare per quanto riguarda le proprietà statiche come la terminazione.
Quindi i tipi dinamici non escludono determinati programmi, ma indirizzano programmi malformati a azioni ben definite, come l'eccezione di lancio.
TLDR
Quindi il lungo e il corto di esso, è che i sistemi di tipi escludono certi programmi. Molti programmi sono interrotti in qualche modo, quindi con i sistemi di tipi evitiamo questi programmi guasti.