Slide 1
Programmation fonctionnelle
1 Introduction: Aperc¸u du paradigme fonctionnel
Programmation fonctionnelle = programmation
applicative
= programmation uniquement avec
des fonctions et des valeurs
Paradigme
radicalement
diff´
erent du paradigme traditionnel (
imp´
eratif
):
Tous les calculs sont faits uniquementen ´
evaluant des
expressions
(ausens“pur”, math´
ematique
du terme, c’est-`
a-dire
sans effet de bord
)
Pas de notion de variable
modifiable
Pas de
proc´
edures
, pas d’objets
Slide 2
Programme imp´
eratif = programme caract´
eris´
e par un
´
etat
implicite qui est modifi´
e par des
instructions
avec des effets de bord:
fact = 1;
for[i = 1 to n]
fact = fact * i;
Forme g´
en´
erale d’un programme fonctionnel = s´
erie de d´
eclarations (constantes et fonctions) +
une expression `
a´
evaluer
ident_1 = ...
ident_2 = ...
...
ident_k = ...
expression_a_evaluer
Note: une fonction, au sens math´
ematique du terme, n’est qu’une forme sp´
eciale de constante!!
Slide 3
Impossible d’obtenir un langage qui soit plus expressif ou plus puissant en
´
eliminant
certaines
constructions
Donc, les langages fonctionnels ont des caract´
eristiques additionnelles:
Fonctions d’
ordre sup´
erieur
: une fonction peut recevoir un argument ou retourner un argu-
ment qui est une fonction
De fac¸onplusg´
en´
erale: les fonctions sont des
citoyens de premi`
ere classe
peuvent ˆ
etre
manipul´
ees de la mˆ
eme fac¸on que les autres valeurs, transmises en argument, rec¸ues en
r´
esultat, conserv´
ees dans des structures de donn´
ees
Utilisation du
pattern-matching
:lad
´
eclaration des diff´
erentes alternatives d’une fonction
peut se faire en indiquant clairement les diff´
erents cas possibles, en fonction de la structure
des arguments
Utilisation de l’´
evaluation non-stricte et/ou paresseuse: les arguments effectifs lors d’un
appel de fonction ne sont pas n´
ecessairement ´
evalu´
es avant l’appel (
call-by-value
) comme
dans les langages traditionnels mais soit en parall`
ele (´
evaluation indulgente), soit au besoin
(´
evaluation paresseuse)
Slide 4
Inf´
erence de type: la plupart des langages
purement
fonctionnels (ce qui exclut LISP) sont
des langages
fortement typ´
es
et ce mˆ
eme s’il n’est pas n´
ecessairedesp
´
ecifier les types
le compilateur peut d´
eduire (inf´
erer) les types des expressions et v´
erifier que tout est
valide.
Polymorphisme: unefonctionest dite
polymorphe
lorsqu’elleest associ´
ee `
auntypeg´
en´
erique,
qui d´
ecrit une
classe
de types possibles
Exemple: la longueur d’une liste (ne d´
epend pas du type des ´
el´
ements)
longueur :: [t] -> Int
longueur [] = 0
longueur (x : xs) = 1 + longueur xs
Slide 5
Pourquoi la programmation fonctionnelle est-elle int´
eressante?
Style de programmation d´
eclaratif, tr`
es pr`
es de ce qu’on ´
ecrirait en math´
ematiques
Plus facile de raisonner `
a propos d’un programme, c’est-`
a-dire, de d´
eterminerles propri´
et´
es
satisfaitespar le programme): on peut utilier le raisonnement par
substitution
(raisonnement
´
equationnel
): “
equals can be replaced by equals
”, comme en math´
ematique
Exemple: Soit x=fa. Alors, toutes les expressions suivantes, dans un langage
pure-
ment
fonctionnel, seront ´
equivalentes:
x+x
2*x
x + (f a)
(f a) + (f a)
Contre-exemple dans un langage imp´
eratif:
int w = 0;
int f( int x ) { return( x + w++ ); }
f(0) != f(0)
Slide 6
L’utilisation de fonctions d’ordre sup´
erieur, du polymorphisme, du
pattern-matching
,de
l’inf´
erence de types et de l’´
evaluation non-stricte conduit `
a des solutions souvent simples,
´
el´
egantes et
succinctes
excellent pour le
prototypage
Mais ...parfois difficile `
ad
´
ebugger, parce que tr`
es difficile (impossible ;-( d’ajouter des
traces: imprimer est un effet de bord et une expression
ne peut pas
avoir d’effets de bord
Slide 7
Quelques langages de programmation fonctionnels utilis´
es de nos jours:
Lisp: langage
impur
(programmation imp´
erative, OO, etc.)
ML: langage strict quasi-pur (notion de ref´
erence)
Haskell: langage purement fonctionnel non-strict paresseux
pH (parallel Haskell): noyau purement fonctionel, non-strict maisnon-paresseux,
pour la programmation parall`
ele
2´
Etude de cas: Haskell
Haskell standard
de facto
pour la programmation fonctionnelle pure non-stricte:
Introduit `
a la fin des ann´
ees 80 suite `
a la prolif´
eration des langages fonctionnels purs et
non-stricts (SASL, KRC, Miranda, LML, Hope, Alfl, Orwell)
D´
efini par un groupe international de chercheurs qui ont voulu d´
efinir un langage moderne
et complet Langage complexe
Slide 8
Fonctions r´
ecursives simples et
pattern-matching
Version classique de la fonction factorielle fact:
fact n = if n == 0
then 1
else n * fact (n-1)
Version avec
pattern-matching
:
fact 0 = 1
fact n = n * fact (n-1)
Version avec gardes:
fact n
|n==0 =1
| n > 0 = n * fact (n-1)
Slide 9
Fonctions avec arguments multiples: fonctions curry´
ees
Diverses versions d’une fonction pour additionner deux nombres:
-- Version avec un argument (paire de nombres)
plus_paire :: (Int, Int) -> Int
plus_paire (x, y) = x + y
-- Version avec deux arguments
plus :: Int -> Int -> Int
plus x y = x + y
-- Diverses utilisations
x = plus_paire (2, 4) -- (_, _) cree un tuple (paire)
x = plus 2 4 -- Prefixe, sans "(" ... ")"
x = 2 ‘plus‘ 4 -- Infixe
Slide 10
Exemple: les racines r´
eelles d’un polynome du second degr´
e
racines :: Float -> Float -> Float -> String
racines a b c
| discriminant > 0.0
= "Deux racines: " ++ show r_plus ++ ", " ++ show r_moins
| discriminant == 0.0
= "Une racine: " ++ show r0
| otherwise
= "Aucune racine reelle"
where
discriminant = bˆ2 - 4.0*a*c
r0=-b/(2.0*a)
r_plus = (-b + sqrt(discriminant)) / (2.0*a)
r_moins = (-b - sqrt(discriminant)) / (2.0*a)
1 / 25 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 !