Identificateurs et fonctions

publicité
INF121:
Algorithmique et Programmation Fonctionnelle
Cours 2: Identificateurs et fonctions
Année 2012 - 2013
Identificateurs
La notion d’identificateur
Un concept fondamental dans les langages de programmation : associer un
nom à une valeur (un identificateur)
Quelques règles de définition des identificateurs en OCaml :
I
longueur maximale : 256 caracères
I
doivent débuter par une lettre minuscule
I
pas d’espace
I
sensible à la casse
I
doivent avoir un nom significatif
Example (Identificateurs (valides et non valides))
I
vitesse X
I
Vitesse 7
I
vitesse moyenne 7
I
vitesse_moyenne X
I
s X7
I
3m 7
I
temporaire3 X
1 / 11
Identificateurs : définition globale
Syntaxe d’une définition globale
let identificateur = expression
,→ la valeur de expression est attachée/liée à identificateur
Le type de identificateur est le type de expression
Cette définition est globale : elle peut être utilisée
I
dans d’autres définitions
I
dans le reste du programme
Définitions simultanées :
let ident1 = expr1
and ident2 = expr2
...
and identn = exprn
Example
I
let x = 1
I
let i = 1
I
let y = 2 + 12
I
let i = i+1
DEMO :
Définitions globales
2 / 11
Identificateurs : définition locale
Example (Comment calculer e=(2∗3∗4)∗(2∗3∗4)+(2∗3∗4)+2 ?)
,→ prod= (2∗3∗4)
,→ e= prod ∗ prod + prod + 2
,→ prod est locale à e
Syntaxe d’une définition locale :
let identificateur = expression1 in expression2
,→ la valeur de expression1 est attachée/liée de manière permanente à
identificateur mais seulement lors de l’évaluation de expression2
Possibilité d’imbrications :
Compatible avec des définitions simultanées :
let id1=expr1 in
let id2=expr2 in
...
let idn = exprn ... in expr
DEMO :
let id1=expr1
and id2=expr2
...
and idn = exprn ... in expr
Définitions locales
3 / 11
Fonctions
Introduction
Jusqu’ici nous avons considéré :
I des expressions
I des opérateurs prédéfinis
Définir une fonction = une portion de code pour un calcul spécifique
Motivations:
I lisibilité du code
I définir un calcul plus élaboré que celui fourni par des opérateurs
existants
I pouvoir effectuer ce calcul à plusieurs endroits d’un programme
Entrées
Fonction
Sorties
args
f
f (args)
Les fonctions dans les langages fonctionnels
I
Pas d’effets de bords (contrairement à C)
I
Proches des fonctions mathématiques
I
Des expressions comme les autres, avec une valeur et un type
4 / 11
Fonctions: fonctions à un argument
Sur un exemple
Example (Valeur absolue du point de vue mathématique)
Z
a
→
7→
N
if a < 0 then −a else a
Example (Valeur absolue en OCaml)
ou
ou
fun a → if a < 0 then −a else a
function a → if a < 0 then −a else a
function (a:int) → if a < 0 then −a else a
mot-clé
Analyse :
param. formel
mot-clé
corps de la fonction
fun
a
→
if a < 0 then −a else a
type:
int
->
int
Remarque Cette fonction est anonyme, i.e., elle n’a pas de nom
DEMO :
Fonctions anonymes
5 / 11
Fonctions
Comment les définir
Nommer une fonction permet de la ré-utiliser
Example (Définir la fonction valeur absolue)
let abs = fun (a:int) → if a < 0 then −a else a
ou
let abs a = if a < 0 then −a else a
ou
let abs (a:int) = if a < 0 then −a else a
ou
let abs (a:int):int = if a < 0 then −a else a
DEMO :
Définir des fonctions
Exercice
Définir la fonction carre: int → int
6 / 11
Fonctions
Comment les utiliser
Comme en maths, le résultat de l’application de f à x est f (x)
Example
I
abs(2)
I
abs(2 − 3)
I
abs 2 (les parenthèse peuvent être omises)
Application d’une fonction
expr1 expr2
Typage : si
et
expr1 a pour type t1->t2
expr2 a pour type t1
alors expr1 expr2 a pour type t2
7 / 11
Fonctions: Généralisation aux fonctions à plusieurs arguments
Example (Aire d’un rectangle)
I
Nécessite 2 paramètres : longueur et largeur (floats)
I
définition:
let aire (x:float) (y:float) : float = x ∗. y
let aire (l:float) (w:float) : float = l ∗. w
I
utilisation : aire 2.3 1.2
Définition d’une fonction à n paramètres
let fct_name (p1:t1) (p2:t2) ... (pn:tn) : t = expr
I
p1, ..., pn sont les paramètres formels
I
Le type de fct_name est t1 -> t2 -> ...
-> tn -> t
Utiliser une fonction à n paramètres
fct_name e1 e2 ... en
I
e1,...,en sont les paramètres effectifs
I
Le type de fct_name e1 e2 ... en est t
si ti est le type de ei et fct_name est de type
t1 -> t2 -> ... -> tn -> t
8 / 11
Fonctions: SPECIFICATION et IMPLEMENTATION
Il est très important de distinguer 2 concepts/étapes lors de la définition d’une
fonctions (et d’un programme en général)
Un contrat
Spécification:
Une description de ce qui est attendu
I
à un certain niveau d’abstraction
I
doit être suffisamment précis
I
proche d’une description “mathématique”
I
peut utiliser des exemples pertinents
Fonction
Entrées
Sorties
Consiste en:
I
1 description
I
1 signature
I
des exemples
Implémentation:
La description de comment le réaliser
I
Entrées
Fonction
Sorties
le code OCaml
Définir une fonction : Spécification PUIS Implémentation
De nombreux avantages (pour le développement de gros programmes)
I ré-utilisation
I on gagne du temps
I penser avant de coder
I on obtient de meilleurs résultats
9 / 11
Définir des fonctions : quelques exemples
Example (Définir la fonction valeur absolue)
I
Spécification:
I
I
I
I
La fonction valeur absolue abs prend un entier n en paramètre et renvoie n
si cet entier est positif et −n si cet entier est négatif. La fonction valeur
absolue renvoie toujours un entier positif.
Profil : Z → N
Exemple : abs(1) = 1, abs(0) = 0, abs(−2) = 2
Implémentation: let abs (a:int) = if a < 0 then −a else a
Example (Définir la fonction carre)
I
Spécification:
I
I
I
I
La fonction carre sq prend un entier n en paramètre et renvoie n ∗ n.
Profil : Z → N
Exemple : sq(1) = 1, sq(0) = 0, sq(3) = 9, sq(−4) = 16
Implémentation: let sq (n:int) = n∗n
10 / 11
Exercices
Un peu d’algorithmique
Exercice
Définir la fonction my_max qui renvoie le maximum de deux entiers
Exercice
Définir les fonctions:
I
carre: int → int
I
somme_carre: int → int → int
tq. somme_carre calcule la somme des carrés de deux entiers
Probléme : moyene olympique
Calcule la moyenne de 4 valeurs, sans prendre en compte la plus petite ni la
plus grande
1. Proposez un type pour la fonction moy_olymp
2. Proposez un algorithme, en supposant que l’on dispose de 2 fonctions
min4 et max4, qui calculent respectivement le minimum et le maximum
de 4 entiers
3. Définissez les fonctions min4 et max4, en utilisant min et max
11 / 11
Téléchargement