Vous êtes sur la page 1sur 13

Introduction la programmation fonctionelle

Objectif du cours: rchir aux principes de base de la programmation et de linformatique travers lapprentissage dun langage simple mais puissant. Diffrence entre programmation (concept abstrait) et programmation sur machine (ralisation particulire dun processus de conception). relative indpendance du langage vis vis des problmes de programmation le choix du langage tient deux choses: puissance dexpression pour rsoudre des problmes complexes et

facilit dutilisation et dapprentissage pour se concentrer sur lessentiel

choix de la programmation fonctionnelle

La programmation fonctionnelle ?
concept fondamental: labstraction traiter une chose complexe en la divisant en choses plus simples et en ignorant les dtails. objets de base : la fonction un programme est un ensemble de fonctions traitant des donnes dentre langages compils : instructions / prparation (compilation) / execution avantage/ inconvnients valuation / dbuggage plus souple plus lent (mais on peut toujours compiler) le langage choisi : Camel la programmation fonctionnelle est une famille de langage trs proches, dont le plus clbre est LISP dvelopp au MIT. le successeur de LISP: scheme: plus lger, plus simple et aussi puissant, utilis pour lducation mais pas de typage des donnes; on utilisera donc un autre langage fonctionnel typ: Camel
2

des langages interprts : instructions / interprt au fur et mesure

machine

A retenir
processus de calcul : tres abstraits mis en uvre dans les ordinateurs ; donnes : ou information, objets manipuls par les processus ; programme : contrle volution des processus ; langage de programmation : traduit les processus de faon symbolique interprte : traduit les processus crit dans un langage de programmation.

Elements de base de la programmation


Le langage de programmation : permet de donner des instructions ;

constitue un cadre dorganisation des processus de calcul.

grce gnralement : des expressions primitives (nombres, fonctions de base) des moyens de composition pour construire des expressions composees dexpressions primitives des moyens dabstraction pour nommer et manipuler des objets composs comme un tout, comme si ctait une expression primitive. Pour la programmation on distingue souvent deux sortes dobjets : les donnes (par ex. les nombres) les procdures (par ex. laddition de nombres) Les procdures portent gnralement sur des objets particuliers
4

Les expressions
linterprte Camel value des expressions > Caml Light version 0.74 #1230 ;; - : int = 1230 la rponse prcise le type de la rponse avec sa valeur. # 10 + (3*4);; - : int = 22 +, /, * sont des oprateurs dcrivant des procdures primitives, les nombres sont des expressions primitives. Une expression compose est forme partir dexpressions (primitives ou non) et doprateurs, termine par ;;
$)     ) @@ 97531 8 6 4 2 0 )(  '% #   (&$$"!
5 6

Les types de base dexpressions


les entiers (int) : les nombres entiers relatifs. les rels (oat) : nombres dcimaux. 1.67 les boolens : le vrai (true) et le faux (false). les caractres (char) : a X & les chanes de caractres (string) bonjour Les oprateurs nacceptent que certains types comme arguments. Par exemple, + ne prend que des entiers : # "toujours" + 29 ;; Entre interactive: > "toujours" + 29 ;; > ^^^^^^^^^^ Cette expression est de type string, mais est utilise avec le type int.

   

Les dnitions
Pour manipuler des objets, ncessit de les nommer: loprateur let # j # # k let j = 20 ;; : int = 20 30 - j ;; : int = 10 let k = 3* j + 27;; : int = 87

La dnition est le moyen de base de labstraction. Elle permet : de reprsenter le rsultat doprations composes ;

de construire des objets complexes par tapes dveloppement et test incrmental des programmes.

Pour cela il faut pouvoir dnir des procdures, moyen dabstraction plus puissant que le nommage dun objet, en nommant des oprations composes partir de paramtres.
7

Les fonctions
ncessit de manipuler des fonctions, avec paramtres de diffrentes sortes, en nombre diffrents besoin dabstraire les fonctions ce qui dnit une fonction : ses paramtres (appels variables en maths) et la faon dont on la calcule;

Par ex. carre : x

mais une fonction peut ltre de plusieurs choses: lnergie cintique en physique, EC: m v Pour dnir une fonction on spcie donc les paramtres et le corps: m v = 0.5 *. m *. v *. v ;;

let cinetik

retourne la fonction cinetik : float -> float -> float = <fun> A lapplication dune fonction, par ex. (cinetik 75.5 25.9), les paramtres formels sont remplacs par les valeurs fournies.
8

 

x*x

Les expressions conditionnelles


Une expression conditionnelle permet lvaluation dune expression diffrencie selon une condition (vrai ou fausse). Par exemple la dnition de la valeur absolue est une expression conditionnelle : si sinon

Elle se traduit en Camel par let abs x = if x >=0 then x else -x ;;

Conditionnelles (suite)
On peut utiliser les oprateurs suivants sur les conditions (boolens): = galit (oprateur polymorphe) or ou logique & et logique not ngation

exercice :
2



10

Exercices
1. Evaluer les expressions suivantes 10;;

5 + 3 + 4;;

9 - 1.;;

6 / 2;;

let a = 3;;

let b = a + 3 ;;

a + (b * a) ;;

a = b ;;

if a = 4 then 6 else if b = 4 then 6+7+a else 25 ;;

2. Ecrire une fonction qui calcule la circonfrence dun cercle en fonction de son rayon.

11

Processus et procdures : la rcursion


1. Ecrire une procdure qui calcule la factorielle :
8

2. Ecrire une procdure qui calcule la suite de Fibonacci:

12

1
4

4 (4 8 4   

1
8 4

1 

1
0 8

1 

8 1 8 1


1  

A retenir :
Le sens dune procdure est indpendant des noms des paramtres formels: let carre x = x * x;; let carre y = y * y;;

Les noms des paramtres dune procdure sont locaux au corps de la procdure let assez-bon? estimation x = (abs ((carre estimation) - x)) < .0001 ;; let carre x = x * x;;

13

Exercices
Ecrire des fonctions ralisant les oprations suivantes : 1. calcul de la norme dun vecteur (2d) donn par ses coordonnes 2. calcul de la moyenne de deux nombres (rels) 3. calcul du maximum de deux entiers 4. vrier si 3 nombres correspondent aux longueurs des cts dun triangle rectangle

14

Processus et procdures
Pour savoir programmer il faut : connatre les lments de base de la programmation

avoir lexprience de la programmation :

connatre les procdures les plus utiles tre capable de prvoir le droulement des acions qui suivra le processus et de diriger ce droulement par un programme. et maintenant quelques formes typiques de droulement de processus...

15

Exemple : extraction de racine carre


diffrence entre fonctions mathmatiques et fonctions programmes

fonction mathmatique dnit une valeur dtermine par un ou plusieurs paramtres

procdures informatiques produit un rsultat mais ne dit pas la valeur exacte... ralisation

proprits

ex

tel que

et

16

Exemple : extraction de racine carre


and now for something completely different... la mthode de Newton par approximations successives : au dpart si y est une approximation de , une meilleure approximation est donne par la . moyenne de et Estimation 1 Quotient x/y 2 1.333333 1.4118

1.41412 ... ... Exercice : crire les procdures qui permettent de calculer la racine avec cette mthode.

Exercices
Ecrire des fonctions ralisant les oprations suivantes : 1. le maximum de trois entiers.

2. la puissance quelconque dun entier (fonction 3. la somme des entiers de 1 n (

4. la somme des entiers de p q

5. la somme de deux entiers en utilisant la fonction suivante : let inc n = 1 + n;;

18

 

  

Exemple pour

1.5 1.4167

Moyenne 1.5 1.4167 1.41412

17

Les procdures et les structures de bloc


Racine1 : premier exemple de processus dni par un ensemble de procdures mutuellement dnies.

Dcomposition dun programme en procdures (sous-problmes): pourrait tre arbitraire ? blocs de 10 lignes non: limportant est que chaque procdure excute une tche bien dnie

on nest pas oblig de soccuper de la faon dont la procdure calcule ce quon lui demande de calculer: ce qui nous intresse est le rsultat

Lutilisateur dune procdure nest pas forcment son auteur il peut la recevoir comme une bote noire venant dun autre, ralisant une certaine fonction (do limportance de lexplicitation des paramtres, interface unique entre la fonction et le programmeur qui lutilise.
19

Les procdures et les structures de bloc : noms locaux


les noms des paramtres dune procdure sont locaux au corps de la procdure; le nom dun paramtre de fonction est une variable lie (le sens de lexpression ne change pas si on renomme le paramtre).

une variable qui nest pas lie est ... libre

lensemble des expressions pour lesquelles une liaison dnit un nom est appel la porte de ce nom.

les variables lis dclares comme paramtre dune procdure ont pour porte le corps de cette procdure.

les variables libres ont pour porte le corps du programme.


20

Les procdures et les structures de bloc : liaisons locales


Sur lexemple de la racine carre, le programme est compose de procdures spares, permettant le contrle de lusage des noms. inconvnient : seul lappel racine est utile vu de lextrieur (ce qui peut tre un problme pour les gros programmes) on peut enfermer les sous-procdures avec des liaisons locales. let racine x = let rec ameliore estimation x = (moyenne estimation (x /. estimation)) and assez_bon estimation x = (abs ((carre estimation) -. x)) < 0.0001 and racine1 estimation x = if (assez_bon estimation x) then estimation else (racine1 (ameliore estimation x) x) in racine1 1.0 x ;;
21

Structure de donnes composes


Jusquici on a vu uniquement des donnes primitives, des types fournis par le langage. Pour la plupart des problmes on a besoin de reprsenter des donnes plus complexes. De mme qu partir de procdures simples on peut faire des procdures composes, on peut construire des types. on veut faire une procdure qui donne le min et en mme temps le max de deux entiers. Mais une fonction ne renvoie quune valeur. on peut utiliser un type compos de deux valeurs: un doublet. Notation : (2,3) let minmax x y = if x < y then (x,y) else (y,x);; let minmax x y = (min x y), (max x y);; De mme on peut utiliser des triplets, des n-uplets... (tuples).

22

Comment rcuperer une valeur de doublet ? let zorgbl x y = let m = minmax x y in (2 * (fst m) + (snd m));; let zorgbl x y = let (m1,m2) = minmax x y in (2* m1 + m2);;

Intrt : regrouper des donnes lies intrinsquement dans un seul objet. Exemple : les vecteurs. Si on crit une somme de 2 vecteurs ( deux dimensions): let som_vect x1 y1 x2 y2 = (x1+x2),(y1+y2) ;; Plus structur (plus abstrait): let som_vect v1 v2 = (fst v1)+(fst v2), (snd v1)+(snd v2);;

23

Les Listes
Si on a besoin dun nombre quelconque (et qui peut voluer) de donnes similaires, on ne peut se contenter de tuples (ex: dictionnaire de mots). Pour cela on peut utiliser des listes: une liste est un ensemble de donnes de mme type. on note une liste [ donnee1; donnee2 ; ... ; donneep ]

Par exemple une liste dentiers: [ 2 ; 19 ; 16 ; 23 ; 20 ] La liste vide est note [] On peut extraire des lments dune liste grce aux deux oprations suivantes, hd(head), tl(tail): hd [ 23 ; 45 ; 78 ];; retourne 23 tl [ 23 ; 45 ; 78 ];; retourne [ 45 ; 78 ] On peut construire une liste avec les oprateurs suivants : 23::[ 45 ; 67 ] retourne [ 23 ; 45 ; 67] [96 ; 23]@[ 45 ; 67 ] retourne [ 96 ; 23 ; 45 ; 67]

24

La liste est un type rcursif:


une liste est

un lment :: une liste

la plupart des fonctions de listes peuvent etre exprims de faon rcursive.

Ex: compter les lments dune liste :

let compter une_liste = if une_liste=[] then 0 else (1 + compter (tail une_liste));;

Exercices
1. Ecrire une fonction qui retourne le maximum dune liste dentiers. 2. Ecrire une fonction qui retourne la somme des lments dune liste 3. Ecrire une liste qui retourne la liste des carrs des lments dune liste entire. 4. Ecrire la fonction map qui retourne la liste des lments dune liste auxquels on a appliqu une fonction f. ex: (map [1 ; 2; 3] carre) [1 ; 4 ; 9]

25

26

Vous aimerez peut-être aussi