INF201 Algorithmique et Programmation Fonctionnelle

Documents pareils
Recherche dans un tableau

Cours de Programmation 2

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Classes et Objets en Ocaml.

STAGE IREM 0- Premiers pas en Python

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

OCL - Object Constraint Language

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Cours 1 : La compilation

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Algorithmique et Programmation, IMA

modules & compilation

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

TP 1. Prise en main du langage Python

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C


Principes des langages de programmation INF 321. Eric Goubault

INF 232: Langages et Automates. Travaux Dirigés. Université Joseph Fourier, Université Grenoble 1 Licence Sciences et Technologies

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Programmation C++ (débutant)/instructions for, while et do...while

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Analyse de sécurité de logiciels système par typage statique

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Initiation à la Programmation en Logique avec SISCtus Prolog

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Notions fondamentales du langage C# Version 1.0

Vérification formelle de la plate-forme Java Card

Objets et Programmation. origine des langages orientés-objet

Java 1.5 : principales nouveautés

Rappels Entrées -Sorties

Présentation du langage et premières fonctions

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Programmation. fonctionnelle, impérative, logique et orientée objet

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

TP3 : Manipulation et implantation de systèmes de fichiers 1

PROJET ALGORITHMIQUE ET PROGRAMMATION II

I. Introduction aux fonctions : les fonctions standards

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Cours d initiation à la programmation en C++ Johann Cuenin

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Utilisation d objets : String et ArrayList

TD3: tableaux avancées, première classe et chaînes

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours d algorithmique pour la classe de 2nde

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Logiciel Libre Cours 2 Fondements: Programmation

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

TP : Gestion d une image au format PGM

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Découverte de Python

Algorithmique et programmation : les bases (VBA) Corrigé

Structurer ses données : les tableaux. Introduction à la programmation

Chap III : Les tableaux

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Cours Informatique Master STEP

Théorie de la Programmation

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Programmation en Caml pour Débutants

Définitions. Numéro à préciser. (Durée : )

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

Initiation à la programmation en Python

Programmer en JAVA. par Tama

Les structures. Chapitre 3

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

ALGORITHMIQUE ET PROGRAMMATION En C

Introduction à MATLAB R

Génie Logiciel avec Ada. 4 février 2013

Une introduction rapide à Coq

Chapitre 10. Les interfaces Comparable et Comparator 1

Peut-on tout programmer?

Algorithmique répartie

2 Comment fonctionne un ordinateur, dans les grandes lignes

Cours No 3 : Identificateurs, Fonctions, Premières Structures de contrôle.

UE Programmation Impérative Licence 2ème Année

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Les deux points les plus proches

Bases de programmation. Cours 5. Structurer les données

Création et Gestion des tables

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Chapitre 10 Arithmétique réelle

SUPPORT DE COURS. Langage C

Initiation à l algorithmique

TP1 : Initiation à Java et Eclipse

Table des matières. Introduction

Introduction au langage C

Java Licence Professionnelle CISII,

Processus d Informatisation

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Transcription:

INF201 Algorithmique et Programmation Fonctionnelle Cours 10 : Ordre supérieur (fin) Année 2017-2018

Plan Quelques rappels Ordre supérieur sur les listes Curryfication

Rappels du cours précédent : types polymorphes Utilisation de types ou fonctions avec types paramètres (notation x) Syntaxe type ( x, y,...) nom_type =... (* def. du type avec x, y,..*) 1 / 20

Rappels du cours précédent : types polymorphes Utilisation de types ou fonctions avec types paramètres (notation x) Syntaxe type ( x, y,...) nom_type =... (* def. du type avec x, y,..*) Exemples types produits : type x cple = x x (2.3, 4.5) : float cple (true, false) : bool cple type ( x, y, z) tple = x y z (3, true, 4) : (int, bool, int) tple 1 / 20

Rappels du cours précédent : types polymorphes Utilisation de types ou fonctions avec types paramètres (notation x) Syntaxe type ( x, y,...) nom_type =... (* def. du type avec x, y,..*) Exemples types produits : type x cple = x x (2.3, 4.5) : float cple (true, false) : bool cple type ( x, y, z) tple = x y z (3, true, 4) : (int, bool, int) tple types sommes : type ( x, y) somme = C1 of x C2 of y C1(5) : (int, x) somme C2( A ) : (char, y) somme type x ens = Nil Cons of x x ens Cons (5, Cons(2, Nil)) : int ens 1 / 20

Rappels du cours précédent : types polymorphes Utilisation de types ou fonctions avec types paramètres (notation x) Syntaxe type ( x, y,...) nom_type =... (* def. du type avec x, y,..*) Exemples types produits : type x cple = x x (2.3, 4.5) : float cple (true, false) : bool cple type ( x, y, z) tple = x y z (3, true, 4) : (int, bool, int) tple types sommes : type ( x, y) somme = C1 of x C2 of y C1(5) : (int, x) somme C2( A ) : (char, y) somme type x ens = Nil Cons of x x ens Cons (5, Cons(2, Nil)) : int ens listes (prédéfinies) polymorphes ( x list) : [1; 2 ; 3 ; 4 ; 5] : int list [ A ; B ] : char list 1 / 20

Rappels du cours précédent : fonctions polymorphes La définition de la fonction ne dépend pas (complètement) du type de ses paramètres... Syntaxe let f (p1 : x) (p2 : y) (...) : r =... (* corps de f *) 2 / 20

Rappels du cours précédent : fonctions polymorphes La définition de la fonction ne dépend pas (complètement) du type de ses paramètres... Syntaxe let f (p1 : x) (p2 : y) (...) : r =... (* corps de f *) Exemples identité let identite (p1 : x) : x = p1 2 / 20

Rappels du cours précédent : fonctions polymorphes La définition de la fonction ne dépend pas (complètement) du type de ses paramètres... Syntaxe let f (p1 : x) (p2 : y) (...) : r =... (* corps de f *) Exemples identité let identite (p1 : x) : x = p1 coupler 2 valeurs let coupler (p1 : x) (p2 : y) : x y = (p1, p2) 2 / 20

Rappels du cours précédent : fonctions polymorphes La définition de la fonction ne dépend pas (complètement) du type de ses paramètres... Syntaxe let f (p1 : x) (p2 : y) (...) : r =... (* corps de f *) Exemples identité let identite (p1 : x) : x = p1 coupler 2 valeurs let coupler (p1 : x) (p2 : y) : x y = (p1, p2) dernier élément d une liste let rec dernier (l : x list) : x = match l with [] failwith "pas de dernier" [e] e e1::e2::s (dernier (e2::s)) 2 / 20

Rappels du cours précédent : ordre supérieur utilisation de fonctions comme paramètres et/ou résultat de fonctions augmente l expressivité du langage programmes plus concis, plus abstraits schémas de programmation (ex : traitement de listes) 3 / 20

Rappels du cours précédent : ordre supérieur utilisation de fonctions comme paramètres et/ou résultat de fonctions augmente l expressivité du langage programmes plus concis, plus abstraits schémas de programmation (ex : traitement de listes) Syntaxe type d une fonction à n paramètres de type ti et résultat de type r : val f : t1 t2... tn r définir une valeur de type fonction : fun (x1 : t1) (x2 : t2)...... (* expression de type r *) 3 / 20

Rappels du cours précédent : ordre supérieur utilisation de fonctions comme paramètres et/ou résultat de fonctions augmente l expressivité du langage programmes plus concis, plus abstraits schémas de programmation (ex : traitement de listes) Syntaxe type d une fonction à n paramètres de type ti et résultat de type r : val f : t1 t2... tn r définir une valeur de type fonction : fun (x1 : t1) (x2 : t2)...... (* expression de type r *) Exemple : que fait cette fonction? let rec m (f : x x) (n : int) : ( x x) = match n with 0 (fun (e : x) e) _ let g = (m f (n 1)) in fun (e : x) (f (g e)) 3 / 20

Rappels du cours précédent : ordre supérieur utilisation de fonctions comme paramètres et/ou résultat de fonctions augmente l expressivité du langage programmes plus concis, plus abstraits schémas de programmation (ex : traitement de listes) Syntaxe type d une fonction à n paramètres de type ti et résultat de type r : val f : t1 t2... tn r définir une valeur de type fonction : fun (x1 : t1) (x2 : t2)...... (* expression de type r *) Exemple : que fait cette fonction? let rec m (f : x x) (n : int) : ( x x) = match n with 0 (fun (e : x) e) _ let g = (m f (n 1)) in fun (e : x) (f (g e)) Que vaut (m (fun x x+1) 5) 3? 3 / 20

Généralisation de la somme des n premiers entiers Somme des n premiers entiers : 1 + 2 +... + (n 1) + n = ( 1 + 2 +... + (n 1) ) + n Implémenté par : let rec somme_entiers (n:int) = if n=0 then 0 else somme_entiers (n 1) + n 4 / 20

Généralisation de la somme des n premiers entiers Somme des n premiers entiers : 1 + 2 +... + (n 1) + n = ( 1 + 2 +... + (n 1) ) + n Implémenté par : let rec somme_entiers (n:int) = if n=0 then 0 else somme_entiers (n 1) + n La somme des n premiers carrés est similaire : 1 2 + 2 2 +... + (n 1) 2 + n 2 = ( 1 2 + 2 2 +... + (n 1) 2) + n 2 Implémenté par : let rec somme_carres (n:int) = if n=0 then 0 else somme_carres (n 1) + (n n) 4 / 20

Généralisation de la somme des n premiers entiers Somme des n premiers entiers : 1 + 2 +... + (n 1) + n = ( 1 + 2 +... + (n 1) ) + n Implémenté par : let rec somme_entiers (n:int) = if n=0 then 0 else somme_entiers (n 1) + n La somme des n premiers carrés est similaire : 1 2 + 2 2 +... + (n 1) 2 + n 2 = ( 1 2 + 2 2 +... + (n 1) 2) + n 2 Implémenté par : let rec somme_carres (n:int) = if n=0 then 0 else somme_carres (n 1) + (n n) Généralisation Définir une fonction sigma qui calcule la somme des images par une fonction f des n premiers entiers Donnez une implémentation de somme_entiers et somme_carres en utilisant sigma 4 / 20

Plan Quelques rappels Ordre supérieur sur les listes Curryfication

Généraliser les fonctions sur les listes? Deux exemples Différents schémas de calcul sur les éléments d une liste l appliquer une fonction f à chaque élt de l sans changer sa structure : [e1 ; e2 ;... ; en] [(f e1) ; (f e2) ;... ; (f en)] exemples : incrémenter chaque élt d une liste d entiers transformer une liste d entiers en liste de caractères (codes Ascii) mettre un texte (liste de lettres) en majuscules fonction map : ( x y) x list y list 5 / 20

Généraliser les fonctions sur les listes? Deux exemples Différents schémas de calcul sur les éléments d une liste l appliquer une fonction f à chaque élt de l sans changer sa structure : [e1 ; e2 ;... ; en] [(f e1) ; (f e2) ;... ; (f en)] exemples : incrémenter chaque élt d une liste d entiers transformer une liste d entiers en liste de caractères (codes Ascii) mettre un texte (liste de lettres) en majuscules fonction map : ( x y) x list y list replier l en appliquant une fonction f à chacun de ses élts : [e1 ; e2 ;... ; en] (f e1 (f e2... (f en acc))) exemples : somme des éléments d une liste maximum d une liste une liste est-elle croissante? fonction fold_right : ( x y y) y x list y 5 / 20

Spécification de la fonction map Etant données : une fonction f de type x y une liste [a_1 ; a_2 ;... ; an] de type x list :: :: a_1 :: a_2 :: map f l -----> f a_1 :: f a_2 :: a_n [ ] f a_n [ ] 6 / 20

Spécification de la fonction map Etant données : une fonction f de type x y une liste [a_1 ; a_2 ;... ; an] de type x list :: :: a_1 :: a_2 :: map f l -----> f a_1 :: f a_2 :: a_n [ ] f a_n [ ] Remarque map renvoie la liste [(f a_1) ; (f a_2) ;... ; (f a_n)] le résultat de f a_i ne dépend pas de la position de l élément a_i map peut changer le type de la liste 6 / 20

Spécification de la fonction map Etant données : une fonction f de type x y une liste [a_1 ; a_2 ;... ; an] de type x list :: :: a_1 :: a_2 :: map f l -----> f a_1 :: f a_2 :: a_n [ ] f a_n [ ] Remarque map renvoie la liste [(f a_1) ; (f a_2) ;... ; (f a_n)] le résultat de f a_i ne dépend pas de la position de l élément a_i map peut changer le type de la liste Typage : map ( x y) x list y list si l est de type x list et f est de type x y alors (map f l) est de type y list 6 / 20

Réalisation de la fonction map Etant données : une fonction f de type x y une liste l = [e1 ; e2 ;... ; en] de type x list construire la liste [(f e1) ; (f e2) ;... ; (f en)]? 7 / 20

Réalisation de la fonction map Etant données : une fonction f de type x y une liste l = [e1 ; e2 ;... ; en] de type x list construire la liste [(f e1) ; (f e2) ;... ; (f en)]? Equation récursives map (f, []) = 7 / 20

Réalisation de la fonction map Etant données : une fonction f de type x y une liste l = [e1 ; e2 ;... ; en] de type x list construire la liste [(f e1) ; (f e2) ;... ; (f en)]? Equation récursives map (f, []) = [] map (f, e::s) = 7 / 20

Réalisation de la fonction map Etant données : une fonction f de type x y une liste l = [e1 ; e2 ;... ; en] de type x list construire la liste [(f e1) ; (f e2) ;... ; (f en)]? Equation récursives map (f, []) = [] map (f, e::s) = (f e)::(map f s) 7 / 20

Réalisation de la fonction map Etant données : une fonction f de type x y une liste l = [e1 ; e2 ;... ; en] de type x list construire la liste [(f e1) ; (f e2) ;... ; (f en)]? Equation récursives map (f, []) = [] map (f, e::s) = (f e)::(map f s) Code Caml let rec map (f : x y) (l : x list) : y list = match l with [] [] e::s (f e)::(map f s) fonction prédéfinie : List.map 7 / 20

Applications de la fonction map Exemple : Vectorisation Spécification: Profil: vectorise: Seq(Elt) Seq(Vect(Elt)), où Vec est l ensemble des listes à un élément Sémantique : vectorise [e1;...;en] = [ [e1] ;... ; [en] ] 8 / 20

Applications de la fonction map Exemple : Vectorisation Spécification: Profil: vectorise: Seq(Elt) Seq(Vect(Elt)), où Vec est l ensemble des listes à un élément Sémantique : vectorise [e1;...;en] = [ [e1] ;... ; [en] ] Implémentation: 8 / 20

Applications de la fonction map Exemple : Vectorisation Spécification: Profil: vectorise: Seq(Elt) Seq(Vect(Elt)), où Vec est l ensemble des listes à un élément Sémantique : vectorise [e1;...;en] = [ [e1] ;... ; [en] ] Implémentation: let vectorise (l: x list) : x list list = (List.map (fun e [e]) l) 8 / 20

Applications de la fonction map Exemple : Vectorisation Spécification: Profil: vectorise: Seq(Elt) Seq(Vect(Elt)), où Vec est l ensemble des listes à un élément Sémantique : vectorise [e1;...;en] = [ [e1] ;... ; [en] ] Implémentation: let vectorise (l: x list) : x list list = (List.map (fun e [e]) l) Exemple : Concatène à chaque Spécification: Profil : Seq( Seq(Elt) ) Seq(Elt) Seq( Seq(Elt) ) Semantique : concatene_a_chaque ([a1;...; an], v) = [ a1@v ;... ; an@v ] 8 / 20

Applications de la fonction map Exemple : Vectorisation Spécification: Profil: vectorise: Seq(Elt) Seq(Vect(Elt)), où Vec est l ensemble des listes à un élément Sémantique : vectorise [e1;...;en] = [ [e1] ;... ; [en] ] Implémentation: let vectorise (l: x list) : x list list = (List.map (fun e [e]) l) Exemple : Concatène à chaque Spécification: Profil : Seq( Seq(Elt) ) Seq(Elt) Seq( Seq(Elt) ) Semantique : concatene_a_chaque ([a1;...; an], v) = [ a1@v ;... ; an@v ] Implémentation : 8 / 20

Applications de la fonction map Exemple : Vectorisation Spécification: Profil: vectorise: Seq(Elt) Seq(Vect(Elt)), où Vec est l ensemble des listes à un élément Sémantique : vectorise [e1;...;en] = [ [e1] ;... ; [en] ] Implémentation: let vectorise (l: x list) : x list list = (List.map (fun e [e]) l) Exemple : Concatène à chaque Spécification: Profil : Seq( Seq(Elt) ) Seq(Elt) Seq( Seq(Elt) ) Semantique : concatene_a_chaque ([a1;...; an], v) = [ a1@v ;... ; an@v ] Implémentation : let concatene_a_chaque (l : x list list) (v : x list) : x list list = List.map (fun (a : x list) a@v) l 8 / 20

Applications de la fonction map Exercices Utilisez la fonction List.map pour réaliser les fonctions suivantes encarre: éléve au carré tous les éléments d une liste d entiers enascii: construit la liste des codes Ascii d une liste de caractères enmajuscule: met en majuscule toutes les lettres d une liste de caractères 9 / 20

Replier les éléments d une liste : motivations... Exemple : Somme des éléments d une liste let rec some (l: int list) : int = match l with [] 0 elt::fin elt + (somme fin) 10 / 20

Replier les éléments d une liste : motivations... Exemple : Somme des éléments d une liste let rec some (l: int list) : int = match l with [] 0 elt::fin elt + (somme fin) Exemple : Produit des éléments d une liste let rec produit (l: int list) : int = match l with [] 1 elt::fin elt (produit fin) 10 / 20

Replier les éléments d une liste : motivations... Exemple : Somme des éléments d une liste let rec some (l: int list) : int = match l with [] 0 elt::fin elt + (somme fin) Exemple : Produit des éléments d une liste let rec produit (l: int list) : int = match l with [] 1 elt::fin elt (produit fin) Exemple : Concatène les éléments d une liste let rec concatene (l : x list list) : x list = match l with [] [] elt::fin elt @ (concatene fin) 10 / 20

Replier les éléments d une liste : motivations... Exemple : Somme des éléments d une liste let rec some (l: int list) : int = match l with [] 0 elt::fin elt + (somme fin) Exemple : Produit des éléments d une liste let rec produit (l: int list) : int = match l with [] 1 elt::fin elt (produit fin) Exemple : Concatène les éléments d une liste let rec concatene (l : x list list) : x list = match l with [] [] elt::fin elt @ (concatene fin) Les seules différences entre ces fonctions sont : le cas de base : ce que renvoie la fonction appliquée à une liste vide comment combiner l élément de tête avec l appel récursif sur la fin de la liste 10 / 20

Replier les éléments d une liste : la fonction fold_right Si on observe les calculs effectués par les fonctions précédentes : somme [a1;a2;...;an] = + a1 (+ a2 (... (+ an 0)...)) produit [a1;a2;...;an] = a1 ( a2 (... ( an 1)...)) concatene [a1;a2;...;an] = @ a1 (@ a2 (... (@ an [])...)) 11 / 20

Replier les éléments d une liste : la fonction fold_right Si on observe les calculs effectués par les fonctions précédentes : somme [a1;a2;...;an] = + a1 (+ a2 (... (+ an 0)...)) produit [a1;a2;...;an] = a1 ( a2 (... ( an 1)...)) concatene [a1;a2;...;an] = @ a1 (@ a2 (... (@ an [])...)) Plus généralement, étant données : une fonction f de type x y y, une liste l = [a_1 ; a_2 ;... ; a_n] de type x list une valeur initiale b de type y :: f a_1 :: a_1 f a_2 :: fold_right f l b - - - - -> a_2 f a_n [ ] a_n b résultat de type y 11 / 20

Réalisation de la fonction fold_right Etant données : une fonction f de type x y y une liste l = [a1;...;an] de type x list une valeur initiale b de type y calculer la valeur (fold_right f l b) = (f a1 (f a2 (... (f an b))))? 12 / 20

Réalisation de la fonction fold_right Etant données : une fonction f de type x y y une liste l = [a1;...;an] de type x list une valeur initiale b de type y calculer la valeur (fold_right f l b) = (f a1 (f a2 (... (f an b))))? Equations récursives fold_right(f, [], b) = 12 / 20

Réalisation de la fonction fold_right Etant données : une fonction f de type x y y une liste l = [a1;...;an] de type x list une valeur initiale b de type y calculer la valeur (fold_right f l b) = (f a1 (f a2 (... (f an b))))? Equations récursives fold_right(f, [], b) = b fold_right(f, a::s, b) = 12 / 20

Réalisation de la fonction fold_right Etant données : une fonction f de type x y y une liste l = [a1;...;an] de type x list une valeur initiale b de type y calculer la valeur (fold_right f l b) = (f a1 (f a2 (... (f an b))))? Equations récursives fold_right(f, [], b) = b fold_right(f, a::s, b) = f (a, (fold_right (f, s, b)) 12 / 20

Réalisation de la fonction fold_right Etant données : une fonction f de type x y y une liste l = [a1;...;an] de type x list une valeur initiale b de type y calculer la valeur (fold_right f l b) = (f a1 (f a2 (... (f an b))))? Equations récursives fold_right(f, [], b) = b fold_right(f, a::s, b) = f (a, (fold_right (f, s, b)) Code Caml let rec fold_right (f : x y y) (l : x list) (b : y) : y = match l with [] b a::s (f a (fold_right f s b)) fonction prédéfinie : List.fold_right 12 / 20

Exercices : utilisation de fold_right En utilisant la fonction List.fold_right : 1. Re-écrire les fonctions précédentes, somme, produit et concatene exemple : let somme (l : int list) : int = List.fold_right (+) l 0 2. nombre d élémenst d une liste 3. maximum d une liste 4. une liste ne contient-elle que des entiers pairs? 5. une liste est-elle croissante? 6. etc. 13 / 20

Repliage par la gauche la fonction fold_left Etant données : une fonction f de type x y x une valeur initiale b de type x: une liste l = [a1 ; a2 ;... ; an] de type y list calculer la valeur (fold_left f b l) = (f (... (f (f b a1) a2)) an)? 14 / 20

Repliage par la gauche la fonction fold_left Etant données : une fonction f de type x y x une valeur initiale b de type x: une liste l = [a1 ; a2 ;... ; an] de type y list calculer la valeur (fold_left f b l) = (f (... (f (f b a1) a2)) an)? Equations récursives fold_left(f, b, []) = 14 / 20

Repliage par la gauche la fonction fold_left Etant données : une fonction f de type x y x une valeur initiale b de type x: une liste l = [a1 ; a2 ;... ; an] de type y list calculer la valeur (fold_left f b l) = (f (... (f (f b a1) a2)) an)? Equations récursives fold_left(f, b, []) = b fold_left(f, b, a::s) = 14 / 20

Repliage par la gauche la fonction fold_left Etant données : une fonction f de type x y x une valeur initiale b de type x: une liste l = [a1 ; a2 ;... ; an] de type y list calculer la valeur (fold_left f b l) = (f (... (f (f b a1) a2)) an)? Equations récursives fold_left(f, b, []) = b fold_left(f, b, a::s) = (fold_left (f, (f b a), s)) 14 / 20

Repliage par la gauche la fonction fold_left Etant données : une fonction f de type x y x une valeur initiale b de type x: une liste l = [a1 ; a2 ;... ; an] de type y list calculer la valeur (fold_left f b l) = (f (... (f (f b a1) a2)) an)? Equations récursives fold_left(f, b, []) = b fold_left(f, b, a::s) = (fold_left (f, (f b a), s)) Code Caml let rec fold_left (f : x y x) (b : x) (l : y list) : x = match l with [] b a::s (fold_left f (f b a) s) fonction prédéfinie : List.fold_left 14 / 20

Autre exemple : filtrer une liste par un prédicat la fonction filter Un prédicat est une fonction qui renvoie un booléen Filtrage par rapport à un prédicat Spécifier et implémenter une fonction filter qui extrait les éléments d une liste l qui vérifient un prédicat p Evaluer un prédicat sur les éléments d une liste Définir une fonction tous qui teste si tous les éléments d une liste satisfont un prédicat p Définir une fonction existe qui teste si au moins un élément d une liste satisfait un prédicat p 15 / 20

Exercices supplémentaires Exercice : map avec fold Redéfinir map en utilisant fold_left Redéfinir map en utilisant fold_right Exercice : minimum et maximum en une ligne de code Définir les fonctions minimum et maximum d une liste en utilisant fold_left et/ou fold_right. 16 / 20

Plan Quelques rappels Ordre supérieur sur les listes Curryfication

A propos de curryfication Exemple : let f (x1:int) (x2:int) (x3:int) : int = x1+x2+x3 f est de type fonction à 3 paramètres entiers et à resultat entier le résultat de (f 1 2 3) est l entier 6 Résultat de (f 1)? fonction à 2 paramètres entiers et à resultat entier L application f1 x1 x2... xn est en fait une suite d applications f n (f n 1... (f 2 (f 1 x1) x2)...) xn Definition : application partielle C est l application d une fonction à n paramètres formels avec strictement moins de n paramètres effectifs. Le résultat d une application partielle est donc une fonction. Typage : Si f est de type t1 t2... tn t, et xi est de type ti pour i [1, j] [1, n] Alors f x1 x2... xj est de type t(j+1)... tn t 17 / 20

A propos de curryfication Quelques exemples Exemple : Appliquer une fonction 2 fois Retour sur la fonction appliquer2fois let appliquer2fois (f:int int) (x:int):int = f (f x) Appliquer appliquer2fois avec un seul argument : appliquer2fois (fun x x +4) renvoie la fonction fun x x + 8 DEMO: appliquer2fois 18 / 20

Intérêts de la curryfication Définition d une fonction qui prend a A et b B et renvoie c C Sans curryfication... Avec currifycation f: ta tb tc f a un seul paramètre (un couple) f (a,b) est de type tc... f: ta tb tc f a deux paramètres f a b est de type tc f a est de type tb tc DEMO: 2 définitions de l addition sur les entiers et le (+) prédéfini de OCaml A retenir La curryfication offre une certaine flexibilité Permet également de spécialiser une fonction Remarque Lorsque l on applique une fonction currifiée il est possible d oublier un paramètre sans s en rendre compte... 19 / 20

Conclusion / Résumé Polymorphisme types généraux type paramètres Ordre supérieur prendre une fonction en paramètre et/ou renvoyer une fonction améliore la qualité du code (concision, schémas généraux) Curryfication application partielle de fonctions spécialisation de fonctions 20 / 20