Bene, andiamo uno per uno.
Valori
I valori sono i dati concreti che i programmi valutano e manipolano. Niente di speciale, alcuni esempi potrebbero essere
1
true
"fizz buzz foo bar"
tipi
Una bella descrizione per un tipo è "un classificatore per un valore". Un tipo è un po 'di informazioni su quale sarà quel valore in fase di esecuzione, ma indicato al momento della compilazione.
Ad esempio, se me lo dici e : bool
al momento della compilazione, e saprò che e
è true
o false
durante il runtime, nient'altro! Poiché i tipi classificano i valori in questo modo, possiamo usare queste informazioni per determinare alcune proprietà di base del tuo programma.
Ad esempio, se mai ti vedessi aggiungere e
e e'
quando e : int
e e' : String
, allora so che qualcosa è un po 'fuori! In effetti posso segnalarlo e lanciare un errore in fase di compilazione, dicendo "Ehi, non ha alcun senso!".
Un sistema di tipi più potente consente tipi più interessanti che classificano valori più interessanti. Ad esempio, consideriamo alcune funzioni
f = fun x -> x
È abbastanza chiaro f : Something -> Something
, ma quale dovrebbe Something
essere? In un sistema di tipo noioso, dovremmo specificare qualcosa di arbitrario, comeSomething = int
. In un sistema di tipo più flessibile, potremmo dire
f : forall a. a -> a
Vale a dire "per qualsiasi a
, f
mappe una
a un a
". Questo usiamo f
più in generale e scriviamo programmi più interessanti.
Inoltre, il compilatore verificherà effettivamente la soddisfazione del classificatore che gli abbiamo dato, se f = fun x -> true
poi abbiamo un bug e il compilatore lo dirà!
Quindi come un tldr; un tipo è un vincolo di tempo di compilazione sui valori che un'espressione può essere in fase di esecuzione.
Costruttore di tipo
Alcuni tipi sono correlati. Ad esempio, un elenco di numeri interi è molto simile a un elenco di stringhe. Questo è quasi come sort
per i numeri interi è quasi comesort
per le stringhe. Possiamo immaginare una sorta di fabbrica che costruisce questi tipi quasi uguali generalizzando le loro differenze e costruendole su richiesta. Ecco cos'è un costruttore di tipi. È un po 'come una funzione da tipi a tipi, ma un po' più limitata.
L'esempio classico è un elenco generico. Un costruttore di tipi per è solo la definizione generica
data List a = Cons a (List a) | Nil
Ora List
è una funzione che associa un tipo a
a un elenco di valori di quel tipo! In Java-land penso che queste siano forse chiamate "classi generiche"
Tipo di parametri
Un parametro di tipo è solo il tipo passato a un costruttore di tipo (o funzione). Proprio come nel livello di valore, diremmo che foo(a)
ha un parametro, a
proprio come List a
ha un parametro di tipo a
.
tipi
I tipi sono un po 'complicati. L'idea di base è che alcuni tipi sono simili. Per esempio, abbiamo tutti i tipi primitivi in Java int
, char
, float
... che tutti si comportano come se avessero lo stesso "tipo". Tranne, quando parliamo dei classificatori per i tipi stessi, chiamiamo i tipi di classificatori. Quindi int : Prim
, String : Box
, List : Boxed -> Boxed
.
Questo sistema fornisce delle buone regole concrete su quale tipo di tipi possiamo usare dove, proprio come i tipi governano i valori. Sarebbe chiaramente una sciocchezza da dire
List<List>
o
List<int>
In Java da allora List
deve essere applicato a un tipo concreto per essere usato così! Se guardiamo ai loro tipi List : Boxed -> Boxed
e da allora Boxed -> Boxed /= Boxed
, quanto sopra è un errore gentile!
Il più delle volte non pensiamo davvero ai tipi e li trattiamo semplicemente come "buon senso", ma con sistemi di tipo più elaborato è qualcosa di importante a cui pensare.
Una piccola illustrazione di ciò che ho detto finora
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Migliore lettura di Wikipedia
Se sei interessato a questo genere di cose, ti consiglio vivamente di investire un buon libro di testo. La teoria dei tipi e il PLT in generale sono piuttosto vasti e senza una base coerente di conoscenza che tu (o almeno io) puoi vagare senza andare da nessuna parte per mesi.
Due dei miei libri preferiti sono
- Tipi e linguaggio di programmazione - Ben Pierce
- Fondamenti pratici dei linguaggi di programmazione - Bob Harper
Entrambi sono libri eccellenti che introducono ciò di cui ho appena parlato e molto altro in dettagli meravigliosi e ben spiegati.