Algorithmique et Programmation Fonctionnelle (APF)

publicité
Algorithmique et Programmation Fonctionnelle (APF)
Algorithmique et Programmation Fonctionnelle
(APF)
RICM3
Cours 2 : fonctions ; sommes et filtrage
Jean-François Monin, Benjamin Wack
2016 - 2017
1 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Installation d’OCaml
Installation d’OCaml
I
sudo apt-get install ocaml camlp4 ledit
I
sudo apt-get install emacs tuareg-mode
2 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions
Mathématiques : x 7→ f (x)
OCaml : fun x → f (x)
3 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions
Mathématiques : x 7→ f (x)
OCaml : fun x → f (x)
Exemple : prédicat « est non nul »
3 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions
Mathématiques : x 7→ f (x)
OCaml : fun x → f (x)
Exemple : prédicat « est non nul »
# let estnonnul = fun x → x <> 0 ; ;
val estnonnul : int → bool = <fun>
(La fonction qui, à tout entier x, associe la valeur de « x 6= 0 »)
3 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions
Mathématiques : x 7→ f (x)
OCaml : fun x → f (x)
Exemple : prédicat « est non nul »
# let estnonnul = fun x → x <> 0 ; ;
val estnonnul : int → bool = <fun>
(La fonction qui, à tout entier x, associe la valeur de « x 6= 0 »)
Définition abrégée
# let estnonnul x = x <> 0 ; ;
3 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions
Mathématiques : x 7→ f (x)
OCaml : fun x → f (x)
Exemple : prédicat « est non nul »
# let estnonnul = fun x → x <> 0 ; ;
val estnonnul : int → bool = <fun>
(La fonction qui, à tout entier x, associe la valeur de « x 6= 0 »)
Définition abrégée
# let estnonnul x = x <> 0 ; ;
Écrire une fonction qui calcule la valeur absolue d’un flottant ?
3 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions à plusieurs arguments
Point de vue au premier ordre (usuel en maths)
fonction à n arguments = fonction à 1 argument : n-uplet
Norme
p
x2 + y2 + z2 d’un vecteur
norme : float × float × float → float
# let norme (x, y, z) = sqrt (x ** 2. +. y ** 2. +. z ** 2.) ; ;
4 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions à plusieurs arguments “Curryfication”
Point de vue à l’ordre supérieur (préféré en prog. fonctionnelle)
I
Fonction à 0 argument = constante
I
Fonction à n + 1 arguments =
fonction à 1 argument qui rend une fonction à n arguments
5 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions à plusieurs arguments “Curryfication”
Point de vue à l’ordre supérieur (préféré en prog. fonctionnelle)
I
Fonction à 0 argument = constante
I
Fonction à n + 1 arguments =
fonction à 1 argument qui rend une fonction à n arguments
Exemples
# let plus = fun x → fun y → x + y ; ;
plus 3 2
se lit
(plus 3) 2
plus : int → int → int
qui se lit
int → (int → int)
5 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions à plusieurs arguments “Curryfication”
Point de vue à l’ordre supérieur (préféré en prog. fonctionnelle)
I
Fonction à 0 argument = constante
I
Fonction à n + 1 arguments =
fonction à 1 argument qui rend une fonction à n arguments
Exemples
# let plus = fun x → fun y → x + y ; ;
plus 3 2
se lit
(plus 3) 2
plus : int → int → int
qui se lit
int → (int → int)
norme : float → (float → (float → float))
# let norme x y z = sqrt (x ** 2. +. y ** 2. +. z ** 2.) ; ;
5 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
aff23 1
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
aff23 1
On se donne une fonction arbitraire f
Quel est le résultat rendu par f en 1 ?
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
aff23 1
On se donne une fonction arbitraire f
Quel est le résultat rendu par f en 1 ?
f 1
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
aff23 1
On se donne une fonction arbitraire f
Quel est le résultat rendu par f en 1 ?
f 1
Fonction val1 qui rend la valeur en 1 d’une fonction f
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
aff23 1
On se donne une fonction arbitraire f
Quel est le résultat rendu par f en 1 ?
f 1
Fonction val1 qui rend la valeur en 1 d’une fonction f
# let val1 = fun f → f 1 ; ;
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en argument d’une fonction
On considère une fonction à 1 argument, par exemple
# let aff23 = fun x → 2*x + 3 ; ;
Quel est le résultat rendu par aff23 en 1 ?
aff23 1
On se donne une fonction arbitraire f
Quel est le résultat rendu par f en 1 ?
f 1
Fonction val1 qui rend la valeur en 1 d’une fonction f
# let val1 = fun f → f 1 ; ;
Que rend val1 aff23 ?
6 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Problème
Écrire une fonction “affine” prenant deux entiers a et b, et
renvoyant la fonction x → ax + b ?
7 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Problème
Écrire une fonction “affine” prenant deux entiers a et b, et
renvoyant la fonction x → ax + b ?
I
Dans la plupart des langages traditionnels : exercice difficile
I
Pas de valeur de type : “fonction int vers int”
7 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Problème
Écrire une fonction “affine” prenant deux entiers a et b, et
renvoyant la fonction x → ax + b ?
I
Dans la plupart des langages traditionnels : exercice difficile
I
Pas de valeur de type : “fonction int vers int”
I
En OCaml les fonctions sont des citoyens de première classe
7 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en résultat d’une fonction
Déjà vu
# let plus = fun x → (fun y → x + y) ; ;
Fonction affine
# let affine = fun a → fun b → (fun x → a ∗ x + b) ; ;
8 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en résultat d’une fonction
Déjà vu
# let plus = fun x → (fun y → x + y) ; ;
Fonction affine
# let affine = fun a → fun b → (fun x → a ∗ x + b) ; ;
Qu’est ce que (affine 2) ?
8 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en résultat d’une fonction
Déjà vu
# let plus = fun x → (fun y → x + y) ; ;
Fonction affine
# let affine = fun a → fun b → (fun x → a ∗ x + b) ; ;
Qu’est ce que (affine 2) ?
Qu’est ce que ((affine 2) 3) ?
8 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Les fonctions peuvent être en résultat d’une fonction
Déjà vu
# let plus = fun x → (fun y → x + y) ; ;
Fonction affine
# let affine = fun a → fun b → (fun x → a ∗ x + b) ; ;
Qu’est ce que (affine 2) ?
Qu’est ce que ((affine 2) 3) ?
Que rend val1 ((affine 2) 3) ?
8 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions en argument et résultat d’une fonction
Exemple : Composition
# let compo f g = fun x -> f (g x)
val compo : (’a -> ’b) -> (’c -> ’a) -> ’c -> ’b =
<fun>
9 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Fonctions en argument et résultat d’une fonction
Exemple : Composition
# let compo f g = fun x -> f (g x)
val compo : (’a -> ’b) -> (’c -> ’a) -> ’c -> ’b =
<fun>
# let f
val f :
# let _
- : int
= compo (fun y -> (y,y+1))(fun t -> t*4)
int -> int * int = <fun>
= f 1
* int = (4, 5)
9 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
«Curryfication» exemple +
A×A→A
plus (3,4)
A→A→A
plus 3 2
se lit
plus : int → int → int
(plus 3) 2
qui se lit
int → (int → int)
10 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
«Curryfication» exemple +
A×A→A
plus (3,4)
A→A→A
plus 3 2
se lit
plus : int → int → int
(plus 3) 2
qui se lit
int → (int → int)
Que rend val1 (affine 2 3) ?
10 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Abréviations pour les définitions de fonctions
let somme3 =
fun x -> (fun y -> (fun z -> x + y + z));;
let somme3 = fun x y z -> x + y + z;;
let somme3 x y z = x + y + z;;
11 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Fonctions
Plan
Installation d’OCaml
Fonctions
Types composés
Filtrage
12 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Plan
Installation d’OCaml
Fonctions
Types composés
Filtrage
13 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Pourquoi composer de nouveaux types ?
I
Tous les langages (même fonctionnels !) offrent à peu près les
mêmes actions algorithmiques (branchement, itération...).
I
L’expressivité d’un langage vient plutôt des structures de
données qu’il permet de représenter et des facilités de
manipulation qu’il offre.
I
Les algorithmes récursifs sont naturellement adaptés à la
manipulation de structures récursives.
14 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Deux grands procédés de composition
I
produits de types
existent nativement dans tous les langages de programmation
I
sommes de types
existent nativement en programmation fonctionnelle typée
Un des points essentiels de APF
15 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Produits : n-uplets
I
Définition d’un type produit :
# type complexe = float * float ; ;
I
Valeurs notées entre parenthèses :
# let e_i_pi_sur_2 = (0., 1.) ; ;
I
Accéder aux composantes du n-uplet :
# let (re, im) = e_i_pi_sur_2 in sqrt (re*.re +. im*.im) ; ;
16 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Besoins contradictoires
Essence du typage
Les arguments fournis à une fonction doivent avoir un sens : ne pas
mélanger entiers, chaînes, booléens, n-uplets, fonctions. . .
Mais on a souvent besoin de mélanger
I
protocoles
I
lexèmes, structures grammaticales
17 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Besoins contradictoires
Essence du typage
Les arguments fournis à une fonction doivent avoir un sens : ne pas
mélanger entiers, chaînes, booléens, n-uplets, fonctions. . .
Mais on a souvent besoin de mélanger
I
protocoles
I
lexèmes, structures grammaticales
Fausse solution : union (casse le typage)
Solution compliquée : types avec discriminants
Solution OCaml : union disjointe = somme
17 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Types somme
Exemple
type nombre =
Ent of int | Reel of float | Cplx of float × float
Ent, Reel, Cplx sont les constructeurs du type.
Valeurs : Ent(3), Reel(2.5), Cplx(0., 1.)
Étant donnée une valeur, l’examen du constructeur permet de
déterminer le type d’origine (ex. int, float, float × float)
18 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Sommes : exemples dégénérés
Énumération
# type couleur = Rouge | Vert | Bleu | Jaune
# type bigout = top | bottom ; ;
19 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Sommes : exemples dégénérés
Énumération
# type couleur = Rouge | Vert | Bleu | Jaune
# type bigout = top | bottom ; ;
Syntax error
# type bigout = Top | Bottom ; ;
19 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Sommes : exemples dégénérés
Énumération
# type couleur = Rouge | Vert | Bleu | Jaune
# type bigout = top | bottom ; ;
Syntax error
# type bigout = Top | Bottom ; ;
Booléens
# type bool = true | false
19 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Types composés
Application : modélisation du jeu de Uno
20 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Filtrage
Plan
Installation d’OCaml
Fonctions
Types composés
Filtrage
21 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Filtrage
Analyse par cas et décomposition
type nombre =
Ent of int | Reel of float | Cplx of float × float
Filtrage
Soit v une valeur de type nombre
match v with
| Ent (n) → e1
| Reel (x) → e2
| Cplx (re, im) → e3
Les expressions ei à droite de « → » doivent avoir le même type.
I e1 dans un environnement augmenté de n : int
I e2 dans un environnement augmenté de x : float
I e3 dans un envt augmenté de re : float et im : float
22 / 23
Algorithmique et Programmation Fonctionnelle (APF)
Filtrage
Exemple : booléens
match b with true → e1 | false → e2
est juste une autre syntaxe pour
if b then e1 else e2
23 / 23
Téléchargement