Programmation fonctionnelle
Objectif
Se familiariser avec la programmation fonctionnelle.
Mise en situation
Certains algorithmes, comme par exemple des calculs mathématiques, n'ont pas besoin de prendre en compte un état quelconque pour être réalisé. Dans ce cas, le résultat final ne dépend que des données d'entrée, sur lesquelles sont appliquées une fonction. C'est ce que l'on appelle la programmation fonctionnelle, qui se concentre donc sur l'utilisation de fonctions.
Définition : Programmation fonctionnelle
C'est un dérivé de la programmation déclarative, ainsi on n'y retrouve pas d'état. Les données ne peuvent être manipulées que par des évaluations de fonctions mathématiques.
Le manque d'état induit une absence d'opération d'affectation. Cela permet aussi d'éviter tout effet de bord et permet de voir le programme comme une véritable application mathématique. Si un bug apparaît, il est très simple à repérer car il se trouve forcément dans la fonction ne présentant pas le résultat voulu. En effet, il n'y a pas de variables partagées ou d'état global.
Autrement dit, un langage fonctionnel offre la possibilité de passer par des fonctions pour atteindre le résultat voulu. Ces fonctions renverront toujours le même résultat pour les mêmes données en entrées sans modifier l'état potentiel qui se trouve à l'extérieur de ces fonctions.
Exemple : JavaScript
Retourner les nombres pairs d'un tableau :
function even (tab) {
return tab.filter(nb => nb % 2 === 0)
}
const someArray = [33, 42, 12, 99, 103, 188]
const evenNumbers = even(someArray)
console.log(evenNumbers)
La fonction filter
applique à chaque élément de tab
la fonction anonyme « nb => nb % 2 === 0
». Dans ce contexte là, la fonction anonyme doit donner une condition. La fonction filter
crée un nouveau tableau (et donc ne modifie pas tab
), et y insère les éléments de tab
répondant à la condition de la fonction passée à filter
.
En programmation impérative il aurait fallu écrire les instructions nécessaires pour parcourir le tableau manuellement et vérifier la condition pour chaque élément. Cela aurait demandé à modifier tab
directement ou écrire le code pour créer un nouveau tableau. On voit bien comment la version fonctionnelle est moins prompte aux erreurs et effets de bords.
Exemple : Haskell
Haskell est un langage purement fonctionnel.
filter even [42, 55, 76, 77, 109]
Les nombres entre crochets forment un tableau d'entiers.
Filter crée un nouveau tableau contenant les éléments du premier en remplissant la condition donnée en premier argument, ici even, qui teste si un nombre est pair.
Remarque :
Haskell est disponible sur Repl.it.
À retenir
La programmation fonctionnelle fait fi des états dans un programme, il n'y a pas de partage de mémoire.
Elle se concentre sur les fonctions, qui ne présentent pas d'effet de bord.
Les fonctions ne dépendent que des données en entrée.