La programmation fonctionnelle avec Scala
Listes
Les listes sont à la programmation fonctionnelle ce que sont les tableaux à la programmation impérative. C'est la structure de données par excellence lorsqu'on travaille avec un algorithme récursif.
Opérations élémentaires
Création :
- liste ordonnée (ou intervale) : ( 1 to 5 ) ou ( 'a' to 'z' )
- liste vide : List() ou Nil
- liste pleine : List(1,2,3,4,5)
Méthodes et opérateurs :
- head : retourne le premier élément.
- tail : retourne la liste de tous les éléments qui suivent le premier.
- l'opérateur :: pour insérer en tête de liste. Exemple «1::2::Nil» créer la liste : List(1,2)
- l'opérateur ::: pour concaténer de listes ensemble.
Méthode d'ordre supérieur
Nous l'avons évoqué plus haut il existe des fonctions d'ordre supérieur s'appliquant aux collections. Évidemment il y en a pour les listes :
- map(f) : applique une fonction sur chaque élément d'une liste.
- filter(f) : conserve les éléments satisfaisant le prédicat f.
- Exemple: la première fonction multiplie les éléments d'une liste par 2 (map) puis la seconde garde les éléments pairs d'une liste.
- La fonction fold (ou reduce dans certains langage) : Parcourt la liste en lui appliquant un opérateur pour la «compresser» en une seule valeur. Dit autrement c'est une «foreach avec accumulateur, qui retourne la valeur finale de l'accumulateur.
En Scala il existe deux fonctions : foldLeft et foldRight. Si l'opérateur utilisé est associatif et commutatif les deux sont interchangeables. Attention le sens de la récursion varie et fordRight n'est pas récursif terminale. Sauf nécessité il vaut mieux utiliser foldLeft. - accu : la valeur d'initialisation de l'accumulateur
- opérateur : la fonction/l'opérateur appliquée à chaque élément de la liste et à l'accumulateur
Syntaxe Pour une liste l d'élément T (List[T]) dont on souhaite réduire une valeure représentative de classe U on écrira :
l.foltLeft[U](accu :U)(operateur(acc:U, ele:T) => U):U avec
Ici on concatène tous les caractère de la liste en une seule chaîne.