Impératif et types¶
Warning
Ce cours a été automatiquement traduit des transparents de M.Noyer par Lorentzo et Elowan et mis en forme par Mehdi, nous ne nous accordons en aucun cas son travail, ce site à pour seul but d’être plus compréhensible pendant les périodes de révision que des diaporamas.
Sommaire
- Tableaux, références, boucles
- Exceptions
-
Types personnalisés
- Type enregistrement
- Type somme
-
Astuce : le type option
Crédits
Develooppez.com
λ OCaml Programming
FAQ Caml
Tableaux, références, boucles¶
Tableaux¶
Déclaration d’un tableau :
Accès aux éléments¶
Parcours d’un tableau, longueur, boucle for¶
Références¶
Une référence est un pointeur vers un objet. Cela permet de rendre des variables mutables.
Egalités¶
==
: égalité physique.
Les deux listes ne sont pas au même endroit de la mémoire.
=
: égalité syntaxique.
Les deux listes "s'érivent pareillement".
!=
: différence physique.
<>
: différence syntaxique.
Boucle while¶
Noter le incr i
qui incrémente de 1 la valeur pointée par i .
Il existe aussi un decr i
.
Exceptions¶
Présentation¶
- En programmation fonctionnelle, les fonctions sont totales, c’est-à-dire qu’elles sont applicables à tout argument qui appartient à leur type de départ.
- Il faut donc être capable de traiter les cas, appelés exceptions, où cet argument n’est pas acceptable. Par exemple : une division par zéro ou bien la recherche de la tête d’une liste vide.
- Ceci peut être fait par des tests préventifs placés dans le corps des fonctions, mais ce mécanisme est très lourd, car il implique un travail important pour le programmeur et il altère la lisibilité d’un programme en masquant son fonctionnement normal.
- C’est pourquoi les langages de programmation modernes comportent un mécanisme spécifique pour le traitement des exceptions.
Exceptions prédéfinies¶
Les exceptions ont le type exn
. On les soulève avec la commande raise
.
- Une exception qui porte bien son nom :
- Une qu’on connaît bien
Observons que l’invocation de failwith
déclenche le raise
.
- Une exception au sens compréhensible
C’est l’évaluateur de OCaml qui déclenche cette exception.
- Une autre qui rappelle le C ou encore Python.
Déclarer une exception¶
Récupération d’une exception¶
La récupération d’une exception déclenchée lors de l’évaluation d’une expression e
peut être réalisée en encapsulant cette expression dans une expression try..with
.Voici la syntaxe à utiliser :
Dans l’exemple suivant, on met la tête de la liste l2
dans l1
et, si une exception de type Failure
est soulevée, on renvoie la liste vide :
Types personnalisés¶
Type enregistrement¶
Présentation¶
L’idée est celle des struct
de C. On accède aux champs avec la notation pointée; on les modifie avec la notation fléchée des tableaux.
Champs mutables¶
Il peut ête souhaitable de modifier certains champs. Il faut les déclarer comme mutable. Par défaut, un champ est persistant.
Polymorphisme¶
Dnas l'exemple ci-dessous, on déclare une structure à deux champs x,y
dont les types ne sont pas connus au départ. Le premier est dun certain type 'a
qui sera connu à l'initialisation, de même le second est d'un type 'b
.
Type somme¶
Présentation¶
- Un type somme est formé d’une liste de cas possibles pour une valeur de ce type, chaque cas comporte un nom de cas, le "constructeur", et une (éventuelle) valeur associé (l’argument du constructeur).
- Un cas dégénéré consiste à définir un type dont les constructeurs n’ont pas d’argument (constructeurs constants). On parle alors de type énuméré (le symbole
|
se lit "ou")
Type somme¶
On peut passer des paramètres aux constructeurs.
- Ci-dessous on définit un type pour les piles d’entiers. Une pile non vide posséde deux éléments : une étiquette entière et une pile (vide éventuellement). On écrit une fonction qui fait la somme du contenu de la liste :
- On crée ensuite une pile dont le sommet est \(3\), l’élément intermédiaire \(2\) et la base \(1\). On lui applique la fonction
somme
:
Type somme polymorphe¶
Ci-dessous on définit un type pour les piles polymorphes. On écrit une fonction qui prend en paramètre une pile, une addition adaptée et une valeur de départ.
On crée ensuite une pile de flottant. On lui applique la fonction somme_polymorphe
à laquelle on passe l’addition des flottants
(+.)
et le point de départ 0.
:
Astuce : le type option¶
Utilité du type option¶
Nous voulons écrire une fonction qui retourne en général une valeur mais, parfois, ne retourne rien.
Par exemple, la fonction list_max
renvoie le maximum d’une liste si elle n’est pas vide. Mais on ne sait trop quoi faire avec la liste vide :
Pour la liste vide, on peut :
- renvoyer une
min_int
? mais le code ne fonctionnerait qu’avec une liste d’entiers - Soulever une exception ? mais il faudra que l’utilisateur se souvienne d’encapsuler ses appels dans un
try..with
- Renvoyer
NULL
? mais cette notion existe en C pas en OCaml
La meilleure solution est d’employer le type option
.
Le type option¶
Le type ’a option
possède deux constructeurs Some
et None
.
Un élément du type option
peut être vu comme une boîte qui est soit vide, soit contenant un objet d’un certain type.
Type option : Accès au contenu¶
On accède au contenu de la boîte par filtrage. Ci-dessous on écrit une fonction qui extrait un entier d’une option (s’il y en a un dedans) et le convertit en string
:
Maximum d’une liste¶
On revient au programme de recherche du maximum. On ne renvoie rien (donc None
) dans le cas où la liste est vide.