D'accord, allons un par un.
Valeurs
Les valeurs sont les données concrètes que les programmes évaluent et jonglent. Rien d'extraordinaire, certains exemples pourraient être
1
true
"fizz buzz foo bar"
Les types
Une belle description pour un type est "un classifieur pour une valeur". Un type est un peu d'informations sur ce que sera cette valeur au moment de l'exécution, mais indiqué au moment de la compilation.
Par exemple , si vous me dites que e : bool
au moment de la compilation, et je saurai que e
est soit true
ou false
lors de l' exécution, rien d' autre! Parce que les types classent les valeurs comme ceci, nous pouvons utiliser ces informations pour déterminer certaines propriétés de base de votre programme.
Par exemple, si jamais je vous vois ajouter e
et e'
quand e : int
et e' : String
, alors je sais que quelque chose ne va pas! En fait, je peux signaler cela et lancer une erreur au moment de la compilation, en disant "Hé, ça n'a aucun sens!".
Un système de types plus puissant permet des types plus intéressants qui classent des valeurs plus intéressantes. Par exemple, considérons une fonction
f = fun x -> x
C'est assez clair f : Something -> Something
, mais qu'est-ce que cela devrait Something
être? Dans un système de type ennuyeux, il faudrait spécifier quelque chose d'arbitraire, comme Something = int
. Dans un système de type plus flexible, on pourrait dire
f : forall a. a -> a
C'est-à-dire "pour tout a
, f
mappe un a
à un a
". Cela nous permet d'utiliser f
plus généralement et d'écrire des programmes plus intéressants.
De plus, le compilateur va vérifier réellement la satisfaction du classifieur que nous lui avons donné, si f = fun x -> true
alors nous avons un bug et le compilateur le dira!
Donc, en tant que tldr; un type est une contrainte de temps de compilation sur les valeurs qu'une expression peut être au moment de l'exécution.
Constructeur de type
Certains types sont liés. Par exemple, une liste d'entiers est très similaire à une liste de chaînes. C'est presque comme sort
pour les entiers, c'est presque comme sort
pour les chaînes. Nous pouvons imaginer une sorte d'usine qui construit ces types presque identiques en généralisant leurs différences et en les construisant à la demande. C'est ce qu'est un constructeur de type. C'est un peu comme une fonction de types en types, mais un peu plus limité.
L'exemple classique est une liste générique. Un constructeur de type pour est juste la définition générique
data List a = Cons a (List a) | Nil
Maintenant, List
c'est une fonction qui mappe un type a
à une liste de valeurs de ce type! En Java-land, je pense que celles-ci sont peut-être appelées "classes génériques"
Paramètres de type
Un paramètre de type est simplement le type transmis à un constructeur de type (ou une fonction). Tout comme dans le niveau de valeur, nous dirions qu'il foo(a)
a un paramètre a
tout comme le List a
fait un paramètre de type a
.
Sortes
Les types sont un peu délicats. L'idée de base est que certains types sont similaires. Par exemple, nous avons tous les types primitifs en Java int
, char
, float
... qui se comportent comme si elles ont le même « type ». Sauf, lorsque nous parlons des classificateurs pour les types eux-mêmes, nous appelons les types de classificateurs. Alors int : Prim
, String : Box
, List : Boxed -> Boxed
.
Ce système donne de belles règles concrètes sur le type de types que nous pouvons utiliser où, tout comme la façon dont les types régissent les valeurs. Ce serait clairement un non-sens de dire
List<List>
ou
List<int>
En Java puisque List
doit être appliqué à un type concret pour être utilisé comme ça! Si nous regardons leurs types List : Boxed -> Boxed
et depuis Boxed -> Boxed /= Boxed
, ce qui précède est une sorte d'erreur!
La plupart du temps, nous ne pensons pas vraiment aux types et les traitons simplement comme du "bon sens", mais avec des systèmes de type plus sophistiqués, il est important de penser à quelque chose.
Une petite illustration de ce que j'ai dit jusqu'à présent
value : type : kind : ...
true : bool : Prim : ...
new F() : Foo : Boxed : ...
Meilleure lecture que Wikipedia
Si vous êtes intéressé par ce genre de chose, je vous recommande fortement d'investir dans un bon manuel. La théorie des types et le PLT en général sont assez vastes et sans base de connaissances cohérente, vous (ou du moins moi) pouvez vous promener sans aller nulle part pendant des mois.
Deux de mes livres préférés sont
- Types et langage de programmation - Ben Pierce
- Fondements pratiques des langages de programmation - Bob Harper
Les deux sont d'excellents livres qui présentent ce dont je viens de parler et beaucoup plus dans de beaux détails bien expliqués.