La programmation fonctionnelle avec Scala
L'évaluation retardée
L'évaluation retardée (ou évaluation différée), est une méthode d'évaluation des expressions par un programme. Elle est parfois abusivement appelée évaluation paresseuse par abus de traduction de l'anglais «lazy evaluation» (lazy n'a pas la connotation négative de paresseux en Français).
Définition : Technique de programmation où le programme n'exécute pas le code avant que les résultats de ce code ne soient réellement nécessaires.
Elle évite donc le calcul d'un résultat si celui-ci n'est finalement pas utilisé. Elle permet également de réutiliser le résultat d'un calcul déjà effectué.
Scala étant multiparadigme son évaluation est stricte par défaut (valeurs évaluées à leur déclaration) comme dans un langage impératif classique. L'évaluation retardée est possible en scala avec «lazy».
Pour bien comprendre son fonctionnement je vous propose d'étudier le code suivant
On observe 3 affectations utilisant 3 fonctions anonymes qui avant de retourner leurs valeurs affichent un message.
- La première utilise l'évaluation stricte. L'évaluation n'est effectuée qu'une fois, à la déclaration de x. La fonction affiche x.
- La deuxième utilise l'évaluation retardée. L'évaluation n'est effectuée qu'une fois, au premier appel de y. La fonction affiche y.
- La troisième est une méthode qui affichera et retournera z à chacun de ses appels
Ce code affiche donc xzyz.
fonctions déterministes
Précédemment nous avons abordé la récursivité terminale. Nous abordons ici une autre bonne pratique de la programmation fonctionnelle : les fonctions déterministes.
Définition : Une fonction déterministe retourne toujours la même valeur pourvu qu'on lui fournisse les même paramètres.
Donc les fonctions interagissant avec l'utilisateur, ou utilisant des données-système qui peuvent varier (l'heure par exemple) ne sont pas déterministes. La bonne pratique veut que ce type de données soit également passé en paramètre.
Les fonctions déterministes ont plusieurs avantages :
- Elles permettent à la machine virtuelle de nombreuses optimisations. Notamment de tirer partie de l'évaluation retardée : une fonction déterministe appelée deux fois avec le(s) même(s) paramètre(s) ne sera calculée qu'une fois.
- Elles sont mieux couvertes par les tests.
- Enfin elles participent à réduire le risque d'effets de bords.