Introduction à OCaml tutoriel
Introduction à OCaml support de cours approfondi
...
Quelques dates
1973 : Robin Milner mets au point ML. Ancêtre d’OCaml à la University of Edinburgh.
1987 : L’INRIA publie Caml, qui reprend les principes de ML.
1996 : Xavier Leroy, Didier Rémy et Jérˆome Vouillon mettent au point Objective Caml, qui sera renomé en OCaml.
2012 : L’INRIA publie OCaml 4.0, le langage est connu est utilisé dans de nombreux domaines.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Principes généraux
En quoi OCaml est spécial
Un typage statique fort. Déterminé par inférence.
Multiparadigme : fonctionnel à effet de bords, objets, modules.
Un outil extrémement puissant : le filtrage de motifs (ou pattern matching).
Un excellent moyen de gérer les erreurs : le système d’exceptions.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Principes généraux
En quoi OCaml est spécial
Un typage statique fort. Déterminé par inférence.
Multiparadigme : fonctionnel à effet de bords, objets, modules.
Un outil extrémement puissant : le filtrage de motifs (ou pattern matching).
Un excellent moyen de gérer les erreurs : le système d’exceptions.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Principes généraux
En quoi OCaml est spécial
Un typage statique fort. Déterminé par inférence.
Multiparadigme : fonctionnel à effet de bords, objets, modules.
Un outil extrémement puissant : le filtrage de motifs (ou pattern matching).
Un excellent moyen de gérer les erreurs : le système d’exceptions.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Principes généraux
En quoi OCaml est spécial
Un typage statique fort. Déterminé par inférence.
Multiparadigme : fonctionnel à effet de bords, objets, modules.
Un outil extrémement puissant : le filtrage de motifs (ou pattern matching).
Un excellent moyen de gérer les erreurs : le système d’exceptions.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Principes généraux
En quoi OCaml est spécial
Un typage statique fort. Déterminé par inférence.
Multiparadigme : fonctionnel à effet de bords, objets, modules.
Un outil extrémement puissant : le filtrage de motifs (ou pattern matching).
Un excellent moyen de gérer les erreurs : le système d’exceptions.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Voyons quelques types...
Les valeurs de base :
Les entiers, les flottants, les chaînes de caractères, les booléens...
...les listes, les tableaux...
...les types produits et somme... et les fonctions !
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Voyons quelques types...
Les valeurs de base :
Les entiers, les flottants, les chaînes de caractères, les booléens...
...les listes, les tableaux...
...les types produits et somme... et les fonctions !
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Voyons quelques types...
Les valeurs de base :
Les entiers, les flottants, les chaînes de caractères, les booléens...
...les listes, les tableaux...
...les types produits et somme... et les fonctions !
Thomas Cours d’informatique 2
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Voyons quelques types...
Les valeurs de base :
Les entiers, les flottants, les chaînes de caractères, les booléens...
...les listes, les tableaux...
...les types produits et somme... et les fonctions !
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
let !
Utiliser let
let x = 1 ; ;
let y = ”bonjour”; ;
let f x = x + 1 ; ;
Attention à la portée des valeurs !
Le x qui sert de paramètre à f n’est pas le même que celui défini au début. Ils n’ont rien à voir !
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
La portée des valeurs
Portée des valeurs déclarées
Les variables déclarées avec “let x = ... ; ;” sont toujours accessible, sauf si une autre valeur du même nom est déclarée plus tard.
On parle de variable globale.
Portée des arguments d’une fonction
Les arguments d’une fonction ne sont accessible que depuis l’intérieur d’une fonction.
Si une valeur du même nom qu’un argument a déjà été déclarée, elle ne sera pas accessible depuis la fonction.
On parle de variable locale.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Déclarer des variables locales
O
n peut déclarer une variable locale au milieu d’un calcul avec let ...
in :
let x = 4 ; ;
let y =
let x2 = x*x in
(x2-x)/2 ; ;
La portée de la variable x2 est limitée au calcul pour lequel elle a été déclarée “(x2-x)/2”
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Quelques connaissances générales
Valeurs et types de base
Faire des tests
Faire des tests avec if ... then ... else ...
L’instruction if
Il est possible d’effectuer des tests avec l’instruction if :
let f x =
if x = 0
then ”zero”
else ”non-nul”
Il est très important de noter que les expressions de then et de else doivent être de même type !
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
1 Découverte d’OCaml
Quelques connaissances générales
Valeurs et types de base
Faire des tests
2 Utilisation plus avancée
Fonctions récursives
Déclarer des types
Le pattern matching
3 Utiliser OCaml de façon impérative
Les références
Les boucles
Structures de données impératives
4 Les modules
Modules externes
Déclarer un module
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
La récursivité
Faire une boucle
On peut réutiliser le nom de la fonction qu’on déclare en ajoutant le mot clef rec :
let rec factorielle n = if n
then 1
else n * ( factorielle (n-1)) ; ;
Il ne faut pas oublier de mettre une condition pour arrêter la fonction, sinon elle ne s’arrête pas.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
La récursivité terminale
Optimiser les appels récursifs
Une fonction récursive peut être optimisée par le compilateur si les appels récursifs sont toujours appelés en dernier.
let factorielle n =
let rec aux n res =
if n
then res
else aux (n-1) (res*n)
in
aux n 1 ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
Les types
Déclarer un alias
On peut déclarer un alias tout simplement avec l’instruction type.
type entier = int ; ;
Déclarer des types somme
On peut déclarer un type qui sera la somme d’autres types :
type nombre = Entier of entier | Reel of float | Rationnel of (entier
* entier) | NaN ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
Les types record
Déclarer un record
On peut déclarer un type somme dont les éléments sont associés à un nom :
type point = { x : int ; y : int } ; ;
Utiliser un record
let p = { x = 0 ; y = 15} ; ;
p.x ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
Les types paramétrés
Créer un type paramétré
type ’a arbre = Noeud of ’a arbre * ’a * ’a arbre | Feuille ; ;
Notez qu’une déclaration de type est toujours récursive.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
Reconnaitre un type somme
Entrer dans un type somme se fait avec un filtrage
let x = Rationnel (5,6) ; ;
match x with
Rationnel (p,q) -> (float p) /. (float q)
| Entier n -> float n
| Reel f -> f
| NaN -> nan ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Fonctions récursives
Déclarer des types
Le pattern matching
Le piège du pattern matching
Attention à la portée des variables !
On ne peut pas comparer deux variables en pattern matching.
Pourquoi ?
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
1 Découverte d’OCaml
Quelques connaissances générales
Valeurs et types de base
Faire des tests
2 Utilisation plus avancée
Fonctions récursives
Déclarer des types
Le pattern matching
3 Utiliser OCaml de façon impérative
Les références
Les boucles
Structures de données impératives
4 Les modules
Modules externes
Déclarer un module
Thomas Cours d’informatique 2
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
La référence, la valeur modifiable
Déclarer et utiliser une référence
let x = ref 0 ; ;
x := 1 ; ;
x := !x + 4 ; ;
!x ; ;
Comportement
Si une référence est modifiée, même dans une fonction, sa valeur est modifiée partout. En fait, une référence n’est pas une valeur mais l’adresse d’une case mémoire o`u est stockée la valeur.
On peut aussi que modifier une référence est une action de type unit. Cela veut dire qu’elle ne renvoie aucune information.
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
La boucle for
Pour i allant de 1 à 20...
let x = ref 0 ; ;
for i = 0 to 20 do
x := !x + i ;
done ; ;
!x ; ;
On peut aussi descendre en mettant downto à la place de to...
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
La boucle while
Tant que cette condition est vraie...
let x = ref 50 000 ; ;
let i = ref 0 ; ;
while x 1 do
incr i ; ;
x :=
if x mod 2 = 0
then !x / 2
else !x * 3 + 1
done ; ;
!i ; ;
Thomas Cours d’informatique 2
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
Quelques structures prédéfinies
Structures modifiables
’a ref, ’a array, string
’a Queue.t, ’a Stack.t
Buffer.t, (’a,’b) Hashtbl.t, ’a Stream.t, Weak.t
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
Quelques structures prédéfinies
Structures modifiables
’a ref, ’a array, string
’a Queue.t, ’a Stack.t
Buffer.t, (’a,’b) Hashtbl.t, ’a Stream.t, Weak.t
Thomas Cours d’informatique 2
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
Quelques structures prédéfinies
Structures modifiables
’a ref, ’a array, string
’a Queue.t, ’a Stack.t
Buffer.t, (’a,’b) Hashtbl.t, ’a Stream.t, Weak.t
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Les références
Les boucles
Structures de données impératives
Structures impératives customizées
Déclaration
type p i = { mutable x : int ; mutable y : int } ; ;
Utilisation
let p = { x = 0 ; y = 0 } ; ;
p.y
p.x,p.y ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
1 Découverte d’OCaml
Quelques connaissances générales
Valeurs et types de base
Faire des tests
2 Utilisation plus avancée
Fonctions récursives
Déclarer des types
Le pattern matching
3 Utiliser OCaml de façon impérative
Les références
Les boucles
Structures de données impératives
4 Les modules
Modules externes
Déclarer un module
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Tout sur les listes !
Fonctions de base
length, hd, tl, nth
rev, append, rev append, concat
iter, iteri, map, mapi, rev map, fold left
for all, exists, mem, find, filter, partition
fast sort, merge et bien d’autres encore...
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Tout sur les listes !
Fonctions de base
length, hd, tl, nth
rev, append, rev append, concat
iter, iteri, map, mapi, rev map, fold left
for all, exists, mem, find, filter, partition
fast sort, merge et bien d’autres encore...
Thomas Cours d’informatique 2
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Tout sur les listes !
Fonctions de base
length, hd, tl, nth
rev, append, rev append, concat
iter, iteri, map, mapi, rev map, fold left
for all, exists, mem, find, filter, partition
fast sort, merge et bien d’autres encore...
Thomas Cours d’informatique 2
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Tout sur les listes !
Fonctions de base
length, hd, tl, nth
rev, append, rev append, concat
iter, iteri, map, mapi, rev map, fold left
for all, exists, mem, find, filter, partition
fast sort, merge et bien d’autres encore...
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Tout sur les listes !
Fonctions de base
length, hd, tl, nth
rev, append, rev append, concat
iter, iteri, map, mapi, rev map, fold left
for all, exists, mem, find, filter, partition
fast sort, merge et bien d’autres encore...
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Tout sur les listes !
Fonctions de base
length, hd, tl, nth
rev, append, rev append, concat
iter, iteri, map, mapi, rev map, fold left
for all, exists, mem, find, filter, partition
fast sort, merge et bien d’autres encore...
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Appeler un module
Appel direct
let l = [1 ;2 ;3] ; ;
List.hd l ; ;
Appel de tout un module
open List ; ;
tl l ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Des modules partout !
Les modules qui seront utiles
Array, String, Random, Printf, Char
Map, Set, Hashtbl
Buffer, Stack, Queue, Stream
Arg, Sys, Marshal, Filename
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Des modules partout !
Les modules qui seront utiles
Array, String, Random, Printf, Char
Map, Set, Hashtbl
Buffer, Stack, Queue, Stream
Arg, Sys, Marshal, Filename
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Des modules partout !
Les modules qui seront utiles
Array, String, Random, Printf, Char
Map, Set, Hashtbl
Buffer, Stack, Queue, Stream
Arg, Sys, Marshal, Filename
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Des modules partout !
Les modules qui seront utiles
Array, String, Random, Printf, Char
Map, Set, Hashtbl
Buffer, Stack, Queue, Stream
Arg, Sys, Marshal, Filename
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Fabriquer rapidement un module
Créer son module
module Mod = struct
type t = int
let f () = 0
let g x = x+1
end ; ;
Découverte d’OCaml
Utilisation plus avancée
Utiliser OCaml de façon impérative
Les modules
Modules externes
Déclarer un module
Signer un module
Spécifier la signature
module type X = sig
type t
val f : unit -> t
val g : t -> t
end
module M : X = Mod ; ;