Approches Fonctionnelles de la Programmation - 48 ...didier/lectures/afp/afp_00_introduction.pdf ·...
Transcript of Approches Fonctionnelles de la Programmation - 48 ...didier/lectures/afp/afp_00_introduction.pdf ·...
Paradigme 1er Ordre Pureté Évaluation Résumé
Approches Fonctionnelles de la Programmationeþ Introduction Eþ
Didier VernaEPITA / LRDE
lrde/~didier @didierverna didier.verna in/didierverna
Paradigme 1er Ordre Pureté Évaluation Résumé
Plan
Un paradigme de Programmation
La Fonction : un Objet de 1re Classe
Programmation Fonctionnelle (Im)Pure
Évaluation Stricte / Paresseuse
Résumé
AFP / Introduction – Didier Verna 2/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Plan
Un paradigme de Programmation
La Fonction : un Objet de 1re Classe
Programmation Fonctionnelle (Im)Pure
Évaluation Stricte / Paresseuse
Résumé
AFP / Introduction – Didier Verna 3/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Un Paradigme de Programmation« Quoi faire » plutôt que « Comment faire »I Un paradigme ?
I Affecte l’expressivité d’un langageI Affecte la manière de penser dans un langageI Le concept de paradigme est poreux
I Lequel ?I ExpressionsI Définitions (expressions nommées)I Évaluations (de définitions ou d’expressions)
AFP / Introduction – Didier Verna 4/24
Paradigme 1er Ordre Pureté Évaluation Résumé
De l’Impératif au Fonctionnel« La somme des carrés des entiers entre 1 et N »
C (impératif)int ssq (int n){
int i = 1, a = 0;while (i <= n)
{a += i*i;i += 1;
}return a;
}
C (récursif)int ssq (int n){
if (n == 1)return 1;
elsereturn n*n + ssq (n-1);
}
Lisp(defun ssq (n)
(if (= n 1)1(+ (* n n) (ssq (1- n)))))
Haskellssq :: Int -> Intssq 1 = 1ssq n = n*n + ssq (n-1)
I ClartéI Concision
AFP / Introduction – Didier Verna 5/24
Paradigme 1er Ordre Pureté Évaluation Résumé
De l’Impératif à l’Envers« La racine carrée de la somme des carrés de a et de b »
C (impératif)float hypo (float a, float b){
float a2 = a*a;float b2 = b*b;float s = a2 + b2;
return sqrt (s);}
C (moins impératif)float hypo (float a, float b){
return sqrt (a*a + b*b);}
Haskellhypo :: Float -> Float -> Floathypo a b = sqrt ((a*a) + (b*b))
Lisp(defun hypo (a b)(sqrt (+ (* a a) (* b b))))
Pour être tout à fait honnête :
Haskell (100% préfixe)hypo :: Float -> Float -> Floathypo a b = sqrt ((+) ((*) a a) ((*) b b))
AFP / Introduction – Didier Verna 6/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Plan
Un paradigme de Programmation
La Fonction : un Objet de 1re Classe
Programmation Fonctionnelle (Im)Pure
Évaluation Stricte / Paresseuse
Résumé
AFP / Introduction – Didier Verna 7/24
Paradigme 1er Ordre Pureté Évaluation Résumé
La Fonction : un Objet de 1re Classe1er ordre, ordre supérieur etc.I Christopher Strachey (1916-1975)
I nommage (variables)I agrégation (structures)I argument de fonctionI retour de fonctionI manipulation anonymeI construction dynamiqueI …
I Plus d’expressivité (clarté, concision etc.)
AFP / Introduction – Didier Verna 8/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Nommage, Affectation, AgrégationAussi simple que d’écrire i = j
Haskellbackwards :: [a] -> [a]backwards = reverse
Scheme(define backwards reverse)
Lisp(setf (symbol-function 'backwards) #'reverse)
AFP / Introduction – Didier Verna 9/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Arguments FonctionnelsDeux archétypes : mapping et foldingI mapping : traiter individuellement les éléments d’une liste par une
fonctionLisp(mapcar #'sqrt '(1 2 3 4 5))
Haskellmap sqrt [1..5]
I folding : combiner les éléments d’une liste par une fonctionLisp(reduce #'+ '(1 2 3 4 5))
Haskellfoldr1 (+) [1..5]sum [1..5]
AFP / Introduction – Didier Verna 10/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Fonctions AnonymesDes littéraux comme les autresI Possibilité de ne pas nommer les fonctions
Lisp(lambda (x) (* 2 x))
Haskell\x -> 2 * x
I Utilisation littérale (comme tout autre type de donnée)Lisp((lambda (x) (* 2 x)) 4)
Haskell(\x -> 2 * x) 4
AFP / Introduction – Didier Verna 11/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Retours Fonctionnels (Anonymes)Aussi simple que return 42;
Lisp(defun adder (n)(lambda (x) (+ x n)))
Haskelladder :: Int -> (Int -> Int)adder n = \x -> x + n
AFP / Introduction – Didier Verna 12/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Pseudo-1er Ordre en ImpératifOn fait ce qu’on peut…I Les structures de contrôle impératives sont des formes fixes de
fonctions d’ordre supérieur
if (expression){ /* ANONYMOUS PROCEDURE ! */
/* blah blah ... */}else{ /* ANONYMOUS PROCEDURE ! */
/* blah blah ... */}
AFP / Introduction – Didier Verna 13/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Plan
Un paradigme de Programmation
La Fonction : un Objet de 1re Classe
Programmation Fonctionnelle (Im)Pure
Évaluation Stricte / Paresseuse
Résumé
AFP / Introduction – Didier Verna 14/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Programmation Fonctionnelle PureLa fonction au sens mathématique
ssq(x) ={1 si x = 1,x2 + ssq(x − 1) sinon.
Haskellssq :: Int -> Intssq 1 = 1ssq n = n*n + ssq (n-1)
I FonctionI Impératif : (procédure) ensemble de calculs à effets de bords avec
éventuellement retour d’une valeurI Fonctionnel Pur : calcul d’une valeur de sortie (retour) en fonction
de valeurs d’entrée (arguments)I Variable
I Impératif : stockage d’information qui varie au cours du temps(mutation)
I Fonctionnel Pur : (constante) valeur inconnue ou arbitraire
AFP / Introduction – Didier Verna 15/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Intérêts de la PuretéPureté =⇒ (plus de) suretéI Parallélisme
I Cf. ErlangI Sémantique locale aux fonctions
I Tests locaux / Bugs locauxI Preuve de programme
AFP / Introduction – Didier Verna 16/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Preuves FormellesInduction mathématique
« Prouvez-moi (s’il vous plaît) que ∀N, ssq(N) > 0 »
Fonctionnel pur
Haskellssq :: Int -> Intssq 1 = 1ssq n = n*n + ssq (n-1)
I C’est vrai au rang 1I Supposons que ce soit vrai
au rang N − 1…
Impératif
Cint ssq (int n){
int i = 1, a = 0;while (i <= n)
{a += i*i;i += 1;
}return a;
}
I Euh…
AFP / Introduction – Didier Verna 17/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Limites du Formalisme MathématiqueComment exprimer le concept de « racine carrée » ?
sqrt(x) = y |{
y > 0
y2 = x
Lisp(defun sqrt (x) ???)
Haskellsqrt :: Float -> Floatsqrt x = ???
Lisp(defun sqrtp (s x)
(and (> s 0)(= (* s s) x)))
Haskellsqrtp :: Float -> Float -> Boolsqrtp s x = s > 0 && s*s == x
I Au final, il faut bien expliquer comment faire…I Mais on repousse le problème : déclaratif ou impératif ?
AFP / Introduction – Didier Verna 18/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Plan
Un paradigme de Programmation
La Fonction : un Objet de 1re Classe
Programmation Fonctionnelle (Im)Pure
Évaluation Stricte / Paresseuse
Résumé
AFP / Introduction – Didier Verna 19/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Évaluation Stricte / ParesseuseÀ quel moment calculer la valeur d’une expression ?I Stricte : Lisp
Les arguments (expressions) sont évalués d’abordI Paresseuse (lazy) : Haskell
Les expressions ne sont évaluées que quand le besoin s’en fait sentir(idem pour les agrégats)
AFP / Introduction – Didier Verna 20/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Évaluation Stricte / ParesseuseLa paresse : une vertu ?I Intérêt : plus d’abstraction
(ex. manipulation de listes infinies)Lisp(defun intlist (s)(cons s (intlist (1+ s))))
;; KO
Haskellintlist :: Int -> [ Int ]intlist s = s : intlist (s + 1)
-- OK
I Contrainte : pureté fonctionnelle requise(on ne peut pas s’appuyer sur l’ordre d’évaluation)
AFP / Introduction – Didier Verna 21/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Pseudo-Paresse en ImpératifOn ne fait toujours que ce qu’on peut…I Les structures de contrôle impératives sont des formes
embryonnaires d’évaluation paresseuse.
if (1){ /* COMPUTED */
/* blah blah ... */}else{ /* NOT COMPUTED ! */
/* blah blah ... */}
AFP / Introduction – Didier Verna 22/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Plan
Un paradigme de Programmation
La Fonction : un Objet de 1re Classe
Programmation Fonctionnelle (Im)Pure
Évaluation Stricte / Paresseuse
Résumé
AFP / Introduction – Didier Verna 23/24
Paradigme 1er Ordre Pureté Évaluation Résumé
Bénéfices de l’Approche FonctionnelleLes 3 caractéristiques des (bons) langages
Procédures / Données
Primitives
Combinaisons Abstractions
I Moins de distinction entre procédures et donnéesI Plus de puissance dans la combinaisonI Plus de puissance dans l’abstraction
AFP / Introduction – Didier Verna 24/24