Munis de toutes ces fonctions de listes, nous sommes prêt à écrire des programmes complets, intéressants et pourtant simples. Ici, nous prenons l'exemple d'un petit script pour compter le nombre d'octets des fichiers de code source (en C, Java, OCaml et Haskell) d'un répertoire, récursivement sur les sous-répertoires.
Nous utilisons les modules (de Core.Std, les trois premiers sont aussi dans la librairie standard) :
On peut copier ce script dans un fichier, et l'exécuter avec l'interprète OCaml (ou bien le rendre exécutable avec #! et chmod) :
Voici le script complet :
Expliquons linéairement le code.
Les lignes 45 à 56 calculent la taille des sources d'un élément d'un répertoire, qui peut être un sous-répertoire. On utilise deux fonctions mutuellement récursives. Pour tester un élément, on teste sa catégorie et on applique la fonction correspondante, 0 sinon. La fonction intéressante est le test de tout un répertoire : Sys.ls_dir nous fournit la liste des noms d'éléments du répertoire. Pour chaque élément, on calcule sa contribution grâce à List.map. Puis on somme avec List.fold_left .
Il faut bien se rendre compte que nous venons de réaliser un parcours d'arbre, simplement avec une récursion et deux fonctionnelles de liste. Ce n'est pas un algorithme complètement trivial, pourtant on l'exprime ici très simplement.