Programmation Fonctionnelle Définitions (et construction) des fonctions

Documents pareils
STAGE IREM 0- Premiers pas en Python

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Algorithmique et Programmation, IMA

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Présentation du langage et premières fonctions

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile


Notions fondamentales du langage C# Version 1.0

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Classes et Objets en Ocaml.

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Cours Informatique Master STEP

TP 1. Prise en main du langage Python

Algorithmique et programmation : les bases (VBA) Corrigé

Programmation Web. Madalina Croitoru IUT Montpellier

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Initiation à la programmation en Python

Initiation à la Programmation en Logique avec SISCtus Prolog

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Conventions d écriture et outils de mise au point

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

I. Introduction aux fonctions : les fonctions standards

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Java DataBaseConnectivity

Création et Gestion des tables

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Rappels Entrées -Sorties

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Introduction au langage C

Les arbres binaires de recherche

Cours d Algorithmique et de Langage C v 3.0

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

OCL - Object Constraint Language

Cours d Informatique

Introduction à l algorithmique et à la programmation M1102 CM n 3

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Algorithmique, Structures de données et langage C

Découverte de Python

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Claude Delannoy. 3 e édition C++

Programmer en JAVA. par Tama

SUPPORT DE COURS. Langage C

2 Comment fonctionne un ordinateur, dans les grandes lignes

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

CREATION WEB DYNAMIQUE

Utilisation d objets : String et ArrayList

3. Conditionnement P (B)

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Chapitre 2. Eléments pour comprendre un énoncé

Programmation en Caml pour Débutants

Compilation (INF 564)

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Solutions du chapitre 4

V- Manipulations de nombres en binaire

Maple: premiers calculs et premières applications

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Recherche dans un tableau

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Les chaînes de caractères

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Langage SQL (1) 4 septembre IUT Orléans. Introduction Le langage SQL : données Le langage SQL : requêtes

Cours 14 Les fichiers

Premiers Pas en Programmation Objet : les Classes et les Objets

Les structures de données. Rajae El Ouazzani

TD3: tableaux avancées, première classe et chaînes

Introduction à JDBC. Accès aux bases de données en Java

Langage Java. Classe de première SI

PHP 5. La base de données MySql. A. Belaïd 1

Cours d algorithmique pour la classe de 2nde

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

as Architecture des Systèmes d Information

INF 321 : mémento de la syntaxe de Java

Programme Compte bancaire (code)

Présentation du PL/SQL

Analyse de sécurité de logiciels système par typage statique

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Initiation à l algorithmique

Chapitre VI- La validation de la composition.

1. Structure d'un programme FORTRAN 95

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Lier Erlang avec d autres langages de programmation

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr

Vérification formelle de la plate-forme Java Card

Théorie de la Programmation

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Plan du cours. Historique du langage Nouveautés de Java 7

EXCEL TUTORIEL 2012/2013

Logique : ENSIIE 1A - contrôle final

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

Représentation d un entier en base b

Cours de Programmation 2

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Transcription:

Programmation Fonctionnelle Définitions (et construction) des fonctions Luigi Santocanale LIF, Aix-Marseille Université Marseille, FRANCE 27 septembre 2016

Plan Conditionnels, conditions de garde, filtrage Expressions Lambda Sections

Plan 3/39 Conditionnels, conditions de garde, filtrage Expressions Lambda Sections

Expressions conditionnelles 4/39 Comme dans tous les langages, on peut définir des fonctions en utilisant des expressions conditionnelles. Par exemple : abs :: Int -> Int abs n = if n >= 0 then n else - n abs prend un entier n et retourne n si n n est pas négatif, sinon il retourne n.

5/39 Les expressions conditionnelles peuvent être imbriquées : signum :: Int - > Int signum n = if n < 0 then -1 else if n == 0 then 0 else 1 Remarque : En Haskell, les expressions conditionnelles possèdent toujours le branche else. Cela évite l ambiguïté des conditionnels imbriqués.

Inférence de type : if.. then.. else.. 6/39 La règle est la suivante : x :: Bool y :: t z :: t if x then y else z :: t Par exemple : > if True then 1 else [1]... Erreur de type : -( > if 1 then tail else ( drop 2)... Erreur de type : -(

Equations avec conditions de garde 7/39 Alternativement au conditionnel, les fonctions peuvent être définies avec des équations avec des conditions de garde (guarded equations). absp :: Int -> Int absp n n >= 0 = n otherwise = - n Comme auparavant, en utilisant les conditions de garde.

8/39 Les équations avec conditions de garde rendent les définitions avec conditions multiples plus lisibles : signump :: Int - > Int signump n n < 0 = -1 n == 0 = 0 otherwise = 1 Remarque(s) : La condition otherwise filtre toutes les conditions. Elle est définie dans prelude.hs par otherwise = True

«Syntactic sugars» 9/39 Le code signump :: Int - > Int signump n n < 0 = -1 n == 0 = 0 otherwise = 1 est precompilé vers le code suivant : signumpp :: Int - > Int signumpp n = if n < 0 then -1 else if n == 0 then 0 else 1

Filtrage par motifs (pattern matching) 10/39 Plusieurs fonctions possèdent une définition assez claire en utilisant le filtrage sur leur arguments. not :: Bool -> Bool not False = True not True = False not envoie False vers True, et True vers False.

11/39 En utilisant le filtrage, la même fonction peut se définir de plusieurs façons. Par exemple : (&&) :: Bool -> Bool -> Bool True && True = True True && False = False False && True = False False && False = False peut se définir aussi par True && True = True _ && _ = False

12/39 La définition True && b = b False && _ = False est plus efficace. Elle permet de ne pas évaluer la deuxième expression. Remarque(s) : Le symbole _ (underscore) est un motif qui filtre tout valeur, sans l assigner à aucune variable.

13/39 Les motifs sont filtrés dans l ordre. Par exemple, cette définition retourne toujours False : _ && _ = False True && True = True Les motifs n ont pas de variables repetés. Par exemple, la définition suivante donne un erreur : b && b = b _ && _ = False

L opérateur cons 14/39 Toute liste non vide est construite par l utilisation de l opérateur binaire : appelé cons qui ajoute un élément en début de liste. L expression [1,2,3,4] est un syntactic sugar pour 1:(2:(3:(4:[]))) La dernière expression met l accent sur la représentation interne de la liste. Rappel : (:) :: a -> [a] -> [a]

Motifs pour les listes 15/39 Les fonctions sur les listes peuvent être définies en utilisant les motifs de la forme x:xs. head :: [a] -> a head (x:_) = x tail :: [a] -> [a] tail (_:xs) = xs head (resp. tail) envoie toute liste non-vide vers son premier élément (resp. vers la listes des éléments restants, la queue).

16/39 Remarque(s) : les motifs x:xs filtrent seulement les listes non vides : > head [] Error les motifs x:xs doivent être parenthésés, car l application est prioritaire sur (:). Par exemple, la définition suivante produit un erreur : head x:_ = x

Motifs (II) 17/39 Une définition par motif est utile pour accéder à un morceaux d information structurée : third :: (a,b,c) -> c third (x,y,z) = z produit :: ( Float, Float ) -> ( Float, Float ) -> ( Float, Float ) produit (xre, xim ) (yre, yim ) = ( xre * yre - xim *yim, xre * yim + xim * yre )

Motifs (III) 18/39 Un motif est un valeur (c est-à-dire, expression non évaluable ultérieurement), pouvant contenir des variables (non répétés). Lors de l appel d une fonction on unifie l argument de la fonction avec le motif ; les variables du motif sont instanciés à des morceaux de l argument. Exemple : reverse (x:xs) = reverse xs ++ [x] reverse [1,2,3] --> (x := 1, xs := [2,3]) reverse [2,3] ++ [1]

case.. of.. : le filtrage explicite 19/39 Le code length :: [a] -> Int length [] = 0 length (_: xs) = 1 + length xs est equivalent à lengthp :: [a] -> Int lengthp xs = case xs of [] -> 0 _:ys -> 1 + length ys

Syntactic sugars 20/39 La fonction abs :: Int -> Int abs n = if n >= 0 then n else - n est precompilée dans le langage noyau comme suit : abspp :: Int -> Int abspp n = case n >= 0 of True -> n False -> -n Les expressions case.. of.. sont le moteur du langage.

Caveats 21/39 Ne pas confondre les définitions par des équations avec conditions de garde avec le filtrage!!!

Plan 22/39 Conditionnels, conditions de garde, filtrage Expressions Lambda Sections

Fonctions anonymes 23/39 On peut construire des fonctions sans lui donner des noms. A ce fin, on utilise la notation λ (lambda). λ x -> x + x la fonction (sans nom) qui prend un entier x et renvoie x + x comme résultat.

24/39 Remarque(s) : On parle de expressions lambda, ou d abstractions. Le symbole λ est la lettre grecque lambda ; elle est tapée au clavier comme backslash, \. En mathématique, les fonctions sans noms sont d habitude dénotées par le symbole, comme dans x x + x. En Haskell, l utilisation du symbole lambda pour les fonctions sans nom vient du lambda-calcul (le fondement théorique du langage Haskell). Les fonctions anonymes, natives du lambda-calcul, sont désormais intégrées dans d autres langages : C++11, Java 8, Javascript, PHP 5.3.0, Perl, Ruby,...

Syntactic sugars (encore une fois) 25/39 La définition twice :: Int -> Int twice x = x + x est equivalent à (precompilée vers) twicep :: Int - > Int twicep = \x -> x + x

Pourquoi utiliser la notation lambda? 26/39 Les λ-expressions donnent une signification formelle (c est-à-dire précise) aux fonctions définies en utilisant la Curryfication. Par exemple : add x y = x+y signifie add = \x -> (\y -> x+y)

Pourquoi utiliser la notation lambda (II)? 27/39 Les λ-expressions sont aussi utiles quand on définie des fonctions qui retournent des fonctions comme résultat. Par exemple : const :: a -> b -> a const x _ = x est plus naturellement définie par : const :: a -> (b -> a) const x = \_ -> x

Pourquoi utiliser la notation lambda (III)? 28/39 Les expressions lambda sont utiles pour nommer des fonctions qu on référence une fois seulement. Par exemple : odds n = map f [0..n -1] where f x = x*2 + 1 peut être simplifiée à odds n = map (\x -> x*2 + 1) [0..n -1]

29/39 L application Rappel Un autre opérateur (associatif à gauche) fondamental qui origine des fonctions est l application d une fonction à un argument dénoté par la juxtaposition : (\x -> \y -> x + y) 1 2 Remplacer les espaces pertinents par des traits permet de localiser les occurrences de cet opérateur. On obtient (après parenthèsage) : ((\ x -> \y -> x + y)_1)_2

Règles de typage 30/39 Abstraction : e :: t 2 x :: t 1 λx e :: t 1 t 2 Application : e :: t 1 t 2 e :: t 1 e e :: t 2 Si l expression e a le type des fonctions t 1 t 2, et e a le type des arguments t 1, alors l expression e e a le type des valeurs retournés par ces fonctions, c est-à-dire t 2. Autrement : Condition nécessaire afin que e e :: t 2 est qu il existe un type t 1 tel que e :: t 1 et e :: t 1 t 2.

Règles de typage 30/39 Abstraction : e :: t 2 x :: t 1 λx e :: t 1 t 2 Application : e :: t 1 t 2 e :: t 1 e e :: t 2 Si l expression e a le type des fonctions t 1 t 2, et e a le type des arguments t 1, alors l expression e e a le type des valeurs retournés par ces fonctions, c est-à-dire t 2. Autrement : Condition nécessaire afin que e e :: t 2 est qu il existe un type t 1 tel que e :: t 1 et e :: t 1 t 2.

31/39 Attention : si les expressions de type contiennent des variables, ces règles s interprètent modulo unification. Exemple : map :: (a b) [a] [b] succ :: Int Int map succ :: [Int] [Int] Les types a et b sont instanciés par Int. Règle générale pour l application : où σ est un MGU de (t 1,t 3 ). e : t 1 t 2 e : t 3 e e : σ(t 2 )

Plan 32/39 Conditionnels, conditions de garde, filtrage Expressions Lambda Sections

Sections 33/39 Un operateur infixe écrit entre ses arguments peut être converti à une fonction Curryfiée, écrite avant ses arguments. Pour cela on utilise le mettre entre parenthèses. Par exemple : > 1+2 3 > (+) 1 2 3

34/39 Cette convention permet aussi d avoir un argument entre parentheses. Par exemple : > (1+) 2 3 > (+2) 1 3 En general, si @ est un operateur, alors les fonctions de la forme (@), (x@ ) et (@y) sont appellées sections.

Utiliser les sections? 35/39 Plusieurs fonctions se définissent en utilisant les sections. Par exemple : (1+) fonction successeur (1/) réciproque (*2) double (/2) moitié

Des fonctions aux operateurs 36/39 Une fonction de deux arguments peut être utilisée en tant que opérateur binaire si on le me entre guillaumets arrière. div :: Int -> Int -> Int deux = 4 div 2

Exercices I 37/39 1. Considerez la fonction f suivante : f [] x d = d x f ((y,z): ws) x d (y x) = z x otherwise = f ws x d Quel est le type de f? 2. Proposez une règle de typage pour les définitions par équations avec condition de garde.

Exercices II 38/39 3. Considérez la fonction safetail qui se comporte exactement comme tail, sauf qu elle envoie la liste vide vers elle même. Rappel : dans ce cas, tail produit un erreur. Définissez safetail en utilisant : (a) une expression conditionnelle ; (b) des équations avec conditions de garde ; (c) le filtrage par motifs. Aide : la fonction du prelude teste si une liste est vide. null :: [a] -> Bool

Exercices III 39/39 4. Donnez trois possibles définitions de l opérateur logique ( ), en utilisant le filtrage par motifs. 5. Redéfinissez la version suivante de (&&) en utilisant les conditionnels au lieu du filtrage : True && True = True _ && _ = False 6. Faites de même pour la version suivante : True && b = b False && _ = False