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