c
2006 Marc Feeley
IFT2030 page 79
Programmation fonctionnelle:
Historique
•(1941) Lambda-calcul: inventé par Alonzo Church
pour étudier la calculabilité
•(1959) Lisp:1er langage symbolique pour l’IA
•syntaxe simple+uniforme, préfixe parenthésé
•récursion, listes, “garbage collection”
•interactif, système de développement intégré,
interprété et compilé
•typage dynamique, polymorphisme
•portée dynamique
•(1975) Scheme: Lisp épuré, portée lexicale
•(1987) ML: typage statique, syntaxe infixe
•(1990) Haskell: fonctionnel pur
c
2006 Marc Feeley
IFT2030 page 80
Programmation fonctionnelle et
les mathématiques (1)
•La programmation fonctionnelle est fondée sur des
bases mathématiques solides
•Tout programme est vu comme une fonction
mathématique
•Le domaine de la fonction correspond aux données
fournies au programme (“l’entrée”)
•L’image de la fonction correspond aux données
produites par le programme (“la sortie”)
•Exemple:
•Domaine = un nom et un fichier de dossiers
•Image = le dossier qui correspond à ce nom
c
2006 Marc Feeley
IFT2030 page 81
Programmation fonctionnelle et
les mathématiques (2)
•Un des principes les plus importants en mathématique
c’est celui de l’égalité
•On se sert de ce principe pour définir les règles de
transformation et de preuve d’un système
•Ex.: ajouter une valeur égale des deux côtés d’une
équation ne change pas sa véracité:
X=Y⇒X+Z=Y+Z
X=Y⇒X×Z=Y×Z
•Cela nous permet de résoudre:
a/2−1 = 3 ⇒a/2−1 + 1 = 3 + 1 ⇒
a/2 = 4 ⇒a/2×2 = 4 ×2⇒a= 8
c
2006 Marc Feeley
IFT2030 page 82
Transparence référentielle (1)
•Principe selon lequel le résultat du programme ne
change pas si on remplace une expression par une
expression de valeur égale
•Ce principe
•Facilite l’analyse d’un programme (pour démontrer
qu’il a une certaine propriété ou qu’il fait le calcul
désiré)
•Facilite les transformations de programme (pour le
rendre plus lisible, en améliorer les performances ou
le compiler)
•Exemple: une règle qui dit “X+X= 2 ×X” permet
de remplacer f(y)+f(y) par 2*f(y)
c
2006 Marc Feeley
IFT2030 page 83
Transparence référentielle (2)
•La programmation impérative viole la transparence
référentielle à cause des effets de bords (affectation,
changement de contenu des fichiers, ...)
•Par exemple
int n = 1;
int f (int x) { n++; return n*x; }
... f(y)+f(y) ... // pas ´
egal `
a 2*f(y)
•En un mot, la programmation fonctionnelle c’est la
programmation sans affectation
1 / 45 100%