Université du Littoral Côte d’Opale M1 Informatique Programmation Fonctionnelle Examen 2015-2016, Session 1, Durée 2h Document autorisé : une feuille de notes manuscrites, comportant votre nom, pas de photocopie 1 Questions de cours (6 points) 1.1 Qu’est-ce-que la programmation fonctionnelle ? 1.2 Citez quatre caractéristiques/fonctionnalités que l’on rencontre généralement dans les langages fonctionnels. 1.3 Quelles sont les deux grandes catégories historiques de langages fonctionnels ? Citez deux langages de chaque catégorie. 1.4 Qu’est-ce-que l’évaluation paresseuse ? Citez deux utilisations intéressantes. 1.5 Qu’est-ce-qu’un effet de bord ? Pourquoi dit-on que Haskell est un langage « purement fonctionnel » et en quoi est-ce intéressant ? 1.6 Qu’est-ce-qu’un type algébrique ? Indiquez notamment comment sont créées et comment sont manipulées les données avec un type algébrique. 2 Moitiés des entiers pairs (3 points) 2.1 Écrivez une fonction récursive moitiesDesPaires1 qui prend une liste d’entiers et retourne la liste des moitiés des éléments pairs. Par exemple, avec la liste [13,37,42,12] on aura pour résultat [21,6]. 2.2 Écrivez une fonction moitiesDesPaires2 équivalente mais utilisant une liste en compréhension. 2.3 Écrivez une fonction moitiesDesPaires3 équivalente mais utilisant des traitements de liste (et en notation « point free »). 3 Fonctions d’ordres supérieurs (4 points) Soit la fonction suivante : maxCoupleEntiers (x,y) = max x y 3.1 Quel est l’ordre de cette fonction ? Écrivez sa signature. 3.2 Écrivez une fonction max2entiers (avec sa signature) équivalente mais sous forme curryfiée. Quel est son ordre ? 3.3 Écrivez une fonction seuiller0Min qui seuille un entier à 0 au minimum, en utilisant la fonction max2entiers (par exemple, avec l’entrée 42 on obtiendra 42 et avec l’entrée -42 on obtiendra 0). Comment appelle-t-on la relation entre seuiller0Min et max2entiers ? 3.4 Écrivez une fonction sommePositifs qui calcule la somme des entiers positifs d’une liste en utilisant une réduction, une lambda et la fonction seuiller0Min. 4 Récursivité (3 points) Pour rappel, on peut calculer la somme des éléments d’un ensemble de façon récursive : S(∅) = 0 S({x1 , x2 . . .}) = x1 + S({x2 . . .}) M1-PF-EX1 2015-2016 page 1 / 2 1. Écrivez une fonction récursive sommeRec qui calcule la somme d’une liste d’entiers en utilisant la définition précédente. 2. Pourquoi dit-on que cette fonction est récursive non-terminale ? Qu’est-ce-que cela implique ? 3. Écrivez une fonction sommeRecTerm qui calcule également la somme d’une liste d’entiers mais en utilisant une fonction auxiliaire et la récursivité terminale. 5 Type algébrique d’arbre binaire (5 points) On veut définir un type de données permettant de manipuler des arbres binaires dont chaque noeud contient un entier. Par exemple : 1 3 2 4 1. Écrivez un type algébrique Arbre correspondant. Indication : définissez des constructeurs à 0, 1 et 2 paramètres. 2. Écrivez une classe Sommable permettant de représenter un type qui peut être sommé en un entier (via une fonction somme). 3. Instanciez la classe Sommable pour votre type Arbre. Par exemple sur l’arbre précédent, somme doit retourner 10. 4. Écrivez une fonction showSomme qui prend une données de classe Sommable et retourne un texte indiquant la somme. Par exemple sur l’arbre précédent, showSomme doit retourner "la somme vaut 10". 5. Écrivez un main qui affiche la somme de l’arbre précédent en utilisant la fonction showSomme. M1-PF-EX1 2015-2016 page 2 / 2