Formation introduction à la programmation fonctionnelle et au langage Caml, tutoriel & guide de travaux pratiques en pdf.
Un mot sur le systeme de types de Caml
Caml est un langage fortement type : toute expression possede exactement un type qui definit precisement quelles op´erations on peut lui appliquer. Le typage est statique, c.-`a-d. que la v´erification de coherence des types est effectu´ ee ` a la compilation. C’est la garantie qu’un programme ne generera jamais d’erreur de type ` a l’ex´ecution. D’autres langages (Lisp, Perl, …) reposent eux sur un typage dynamique, c.-a-d. que la coherence des types est verifiee a l’execution. C’est en ce sens que Caml est un langage sur. Une grande force de Caml est que dans ce cas cette sureté via le typage n’est obtenue
5Jamais de seg fault, ni de core dump !
– ni au prix d’une verbosite accrue du langage : les types n’ont pas a etre specifies par le programmeur, ils sont inf´ er´ es par le compilateur6, – ni au prix d’une limitation de l’expressivit´ e du langage. Au contraire, la notion de type polymorphe permet de d´efinir tr` es simplement des fonctions g´en´eriques tr` es puissantes7 (comme length, member, …) La paragraphe suivant donne une idée, sur un exemple simple, de la mani`ere dont le compilateur procede pour inferer le type d’une expression (ce paragraphe peut ˆetre saut´ e en premi`ere lecture). Reprenons la definition de la fonction list sum #let rec list sum l = match l with [] → 0 | x :: xs → x + list sum xs;; val list sum : int list → int = <fun> Pour deduire que list sum a pour type int list → int, le compilateur proc`ede en gros de la mani`ere suivante8 : 1. l’argument de list sum peut etre []. Il s’agit donc d’une liste. Son type est donc α list, o` u α est inconnu pour l’instant 2. dans la seconde clause, x :: xs a aussi pour type α list, donc x a pour type α et xs pour type α list 3. la valeur de retour de list sum dans le premier cas est 0, de type int 4. dans le second cas, cette valeur est ajout´ ee ` a x pour produire un int. Donc x a pour type int 5. donc α = int 6. donc l’argument de list sum a pour type int list 7. donc list sum a pour type int list → int Si on on ecrit : #let rec list sum l = match l with [] → 0.0 | x :: xs → x + . list sum xs;; val list sum : float list → float = <fun> le type infere est float → float list. Si on ´ecrit : #let rec list sum l = match l with [] → true | x :: xs → x + list sum xs;; Characters 64 − 79 : | x :: xs → x + list sum xs;; ˆˆˆˆˆˆˆˆˆˆˆˆˆˆˆ This expression has type int but is here used with type bool le systeme signale fort justement une erreur de typage.