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”)
Limage 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=YX+Z=Y+Z
X=YX×Z=Y×Z
Cela nous permet de résoudre:
a/21 = 3 a/21 + 1 = 3 + 1
a/2 = 4 a/2×2 = 4 ×2a= 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%