2015-2016, Session 1

publicité
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
Téléchargement