On souhaite implémenter un module de file first-in first-out, avec l'interface suivante
une solution naïve consiste à définir :
Implémenter cette solution.
On va maintenant fournir des fonctionnelles sur notre file, en donnant un foncteur transformant un module de type MinFILE en module de type FILE :
Coder ce foncteur.
Le module Pervasive fournit un type bien utile, le type option permettant de coder une valeur optionnelle :
coder une fonction qui filtre les options d'une liste, pour garder uniquement les valeurs définies :
quel est le type de la fonction suivante ?
Plusieurs structures de données, par exemple Map.S, implémentent l'interface :
On peut combiner les mem et find en une seule fonction de type :
Écrire un foncteur Add_MF, qui construit automatiquement la fonction mem_find à partir d'une implémentation de ASSOC. On pourra ensuite écrire, par exemple :
pour obtenir un module implémentant Map.S étendu à la fonction mem_find.
On se propose d'implémenter une file de priorité (un tas) en programmation fonctionnelle. Souvenons-nous qu'un tas sur un type ordonné implémente les opérations d'insertion, et de suppression du minimum. Usuellement, l'implémentation est le tas binaire. Mais puisque nous n'avons pas le droit d'utiliser de tableau, nous allons devoir innover.
Commençons par écrire une implémentation sur les entiers, la dernière question consistera à transformer notre code en foncteur. Nous allons utiliser le type suivant :
Écrire les valeurs suivantes :
La première chose à faire est d'écrire une fonction prenant deux tas, et retournant l'union de ces deux tas. Si les deux tas sont non-vides, il suffit de rajouter le tas dont le minimum est le plus grand à la liste contenue dans l'autre tas :
Coder la fonction merge
Cette première solution offre dans certains cas des performances médiocres. À la place, nous faisons les opérations de merge dans un ordre bien particulier. Si la liste de tas est $[t_1;t_2;\ldots;t_n]$ et $\oplus$ dénote l'opérateur infixe pour merge, on calcule :
$$(t1 \oplus t2) \oplus (t3 \oplus t4) \oplus (t5 \oplus t6) \oplus \ldots \oplus \left(t_n\;\text{ou}\;(t_{n-1} \oplus t_n)\;\text{selon la parité de}\;n\right)$$
Écrire une fonctionnelle de liste généralisant cette expression, puis l'appliquer pour obtenir l'opération de suppression du minimum.
Cette implémentation des tas porte le nom de tas par appariement. Cette implémentation simple est aussi très efficace en pratique, mais très difficile à analyser de manière théorique (il est conjecturé que la complexité amortie des opérations d'insertion et fusion est $O(1)$, mais personne n'est parvenu à le prouver). Par ailleurs, par rapport aux tas binaires, on gagne une opération de fusion qui n'est pas du tout implémentable dans les tas binaires.