Calcul formel Une introduction 1 Programme Introduction à la programmation fonctionnelle avec le langage CAML Interprétation et évaluation Expressions et précédence des opérateurs Définitions Types élémentaires Produit cartésien Les listes Définition des fonctions La construction match-with et le filtrage Structures de données Récursivité Exceptions et fonctions partielles Polymorphisme et fonctions d’ordre supérieur 2 Programmation fonctionnelle(1) concept fondamental: L’Traiter une chose complexe en la divisant en choses plus simples et en ignorant les détails. objets de base : la Un programme est un ensemble de fonctions traitant des données d’entrées. des langages interprétés instructions / interprété au fur et à mesure —> machine ≠ langages compilés : instructions / préparation (compilation) / exécution 3 Programmation fonctionnelle(2) pas de commandes, ni de séquencement de commandes. L’accent est mis sur le concept d’expression (termes) et leur évaluation Programme = groupe de fonctions Relations entre fonctions : une fonction peut appeler une autre fonction le résultat d’une fonction peut être un argument d’une autre fonction 4 Programmation fonctionnelle(3) la programmation fonctionnelle est une famille de langage très proches, dont le plus célèbre est LISP développé au MIT. le successeur de LISP: scheme: plus léger, plus simple et aussi puissant, utilisé pour l’éducation ou le scriptage (ex: Gimp) mais pas de typage des données ; on utilisera donc un autre langage fonctionnel typé: Caml 5 Suite… Les langages fonctionnel sont fortement présent dans les laboratoires, faible pénétration dans le milieu industriel 6 Ses points forts les programmes peuvent être écrits rapidement (surtout pour le prototypage) et de manière concise bien adaptés au parallélisme ramène l’itération à la récursion 7 Concepts de base Les langages fonctionnels modernes supportent les concepts suivants : Fonctions d’ordre supérieur Evaluation tardive(Lazy evaluation) Filtrage de motifs(Pattern matching) Polytypes et inférence de types 8 Fonctions d’ordre supérieur Généralement, les langages classiques, traitent les fonctions comme des fonctions de premier-ordre, c’est-à-dire: les paramètres de celles-ci sont traités de manière non fonctionnelle. 9 Exemple(1) Soit la fonction power, écrite en ML, d’abord de manière classique puis comme une fonction d’ordre supérieur. Fun power (n,b) = if n = 0 then 1.0 else b * power (n-1, b) profil : integer × real 10 real Exemple(2) fun powerc (n) (b) = if n = 0 then 1.0 else b * powerc (n- 1)(b) profil: integer- > (real -> real) Power devient une fonction qui appliquée à un entier retourne une fonction. Celle-ci appliquée à un réel retourne la nième puissance de ce réel. 11 Evaluation tardive (Lazy evaluation) Libère le programmeur des questions relatives à l’ordre d’évaluation. Ceux-ci pour des raisons d’efficacité préfèrent ne pas évaluer des sous-expressions si cela n’est pas nécessaire : 12 Suite… La lazy-evaluation offre la possibilité de construire des structures infinies (telles que les listes) Exemple Fun from (n) = 13 n :: from(n+1) Filtrage de motifs (Pattern matching) Concept très utilisé dans les langages fonctionnels modernes Idée : utilisation du raisonnement équationnel dans la conception et la construction de programmes Définir une même fonction par le biais de plusieurs équations Seule, une de ces équations pourra être appliquée dans un contexte donné 14 Poly types et inférence de types(1) On appelle poly type, un type qui contient une ou plusieurs variables de types 15 Poly types et inférence de types(2) dans un langage à typage statique, le type de chaque variable, paramètre , … est explicitement donné à la déclaration de ces derniers le compilateur n ’a pas à déterminer leur type suivant le contexte Mais quand le système doit déterminer lui-même le type d ’une entité, en fonction du contexte, on dit qu ’il fait de l ’inférence de types 16 Suite… Une situation d ’inférence de type simple dans les langages à typage statique est la suivante : Const I = expression Le compilateur aura à inférer le type de I d ’après le type de l ’expression . 17 Exemples Exemple1 fun even (n) = n mod 2 = 0 Si on sait que l ’opérateur mod a pour type integer x integer -> integer On peut inférer le type que du paramètre n est integer et celui de la fonction even integer -> boolean Le type inféré peut être un polytype 18 Suite… Exemple2 fun Id(x) = x Si on suppose que le type de x est T, alors le type de ID est T-> T 19