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