Programmation fonctionnelle
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 1
Histoire
(1941) Lambda-calcul : invent´e par Alonzo Church pour ´etudier
la calculabilit´e
(1959) Lisp : premier langage symbolique pour l’IA
syntaxe simple et uniforme, pr´efixe parenth´es´e
r´ecursion, listes, «garbage collection»
interactif, syst`eme de d´eveloppement int´egr´e, interpr´et´e et
compil´e
typage dynamique, polymorphisme
port´ee dynamique
(1975) Scheme : Lisp ´epur´e et minimal, port´ee lexicale
(1987) ML : typage statique, syntaxe infixe
(1990) Haskell : fonctionnel pur
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 2
Transparence r´ef´erentielle
Principe selon lequel le r´esultat du programme ne change pas si
on remplace une expression par une expression de valeur ´egale
Ce principe
facilite l’analyse d’un programme (par exemple pour d´emontrer
qu’il fait le calcul d´esir´e)
– facilite les transformations de programme (par exemple pour
en am´eliorer les performances)
Exemple : remplacer f(x)+f(x) par 2*f(x)
La programmation imp´erative viole ce principe `a cause des effets
de bords (affectation, E/S, . . . )
Programmation fonctionnelle = sans affectation
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 3
Transparence r´ef´erentielle II
Cons´equences
La valeur d’une expression epend seulement de la valeur de ses
sous-expressions (exemple : E1+E2)
L’ordre d’ex´ecution a beaucoup moins d’importance qu’en pro-
grammation imp´erative (E1 peut ˆetre ´evalu´e avant, apr`es ou
pendant l’´evaluation de E2)
Le mod`ele de calcul est plus proche des math´ematiques, ce qui
permet d’appliquer les mˆemes techniques de preuves et de rai-
sonnement (exemple preuve par induction)
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 4
Le langage Scheme
Scheme est un langage bas´e sur les expressions (la cat´egorie
syntaxique principale est l’expression)
L’´evaluation d’une expression c’est le processus qui permet de
trouver sa valeur
`
A part les expressions triviales (constante et variable) les expres-
sions ont toujours la forme parenth´es´ee (notation pr´efixe !) :
(hop´erationi hargumentsi)
hop´erationiest un mot cl´e r`egles sp´eciales
sinon appel de fonction ; hargumentsisont les param`etres ac-
tuels pass´es par valeur
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 5
Formes sp´eciales : if
1. (ifhexpr1ihexpr2ihexpr3i)
´evaluer hexpr1i
si le r´esultat n’est pas #f «retourner»la valeur de hexpr2isinon
«retourner»la valeur de hexpr3i
NOTER BIEN : les arguments ne sont pas toujours tous ´evalu´es,
donc la s´emantique est diff´erente d’un appel de fonction ordi-
naire.
Exemple : (if (< x y) x y)
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 6
Formes sp´eciales : lambda
lambda{hidenti}hexpri!
cette lambda-expression cr´e´ee une fonction anonyme et la re-
tourne en tant qu’objet de premi`ere classe
les param`etres formels de la fonction sont hidenti(notez l’ab-
sence de type)
lorsque cette fonction est appel´ee, il y a cr´eation des variables
locales hidenti. . . dont la valeur initiale est donn´ee par les pa-
ram`etres actuels et dont la port´ee est hexpri, ensuite la valeur
de hexpriest retourn´ee comme r´esultat de l’appel
(let ((f (lambda (x) (* x x))))
(f (f 10)))
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 7
Formes sp´eciales : let
2. let{(hidentihexpri)}hcorpsi!
´evaluer les hexpri
– cr´eer les «variables locales»hidenti. . . dont la valeur initiale
est donn´ee par hexpriet dont la port´ee est hcorpsi
«retourner»la valeur de hcorpsi
(let ((x (+ 1 2))
(y (* 3 4)))
(if (< x y) x y))
(let ((x 1))
(+ (let ((x (+ x 1)) (y (+ x 2))) (* x y))
x))
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 8
Formes sp´eciales : let II
2a. let*
´evaluation s´equentielle des liaisons
2b. letrec
r´ecursion dans les valeurs initiales
(let ((fact (lambda (n)
(if (zero? n)
1
(* n (fact (sub1 n)))))))
(fact 4))
erreur car fact n’est pas d´efini
IFT 2030, v 1.0
Universit´e de Montr´eal Port´ee et activations 9
1 / 5 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !