# Programmation purement fonctionnelle

En informatique, la programmation purement fonctionnelle est un paradigme de programmation — un style de construction de la structure et des éléments des programmes informatiques — qui considère toutes les opérations comme l'évaluation de fonctions mathématiques.
L'état et les objets immuables sont généralement modélisés à l'aide d'une logique temporelle, en tant que variables explicites représentant l'état du programme à chaque étape de son exécution : l'état d'une variable est transmis en tant que paramètre d'entrée d'une fonction de transformation d'état, qui renvoie l'état mis à jour en tant que partie de sa valeur de retour. Ce style gère les modifications d'état sans perdre la transparence référentielle des expressions du programme.
La programmation fonctionnelle pure consiste à s'assurer que les fonctions dans un paradigme fonctionnel, ne dépendent que de leurs arguments, indépendamment de tout état global ou local. Un sous-programme fonctionnel pur ne peut voir que les changements d'état des variables incluses dans sa portée.

## Différence entre la programmation fonctionnelle pure et impure

La différence exacte entre la programmation fonctionnelle pure et impure est controversée. La définition proposée par Sabry de la pureté est que toutes les stratégies d'évaluation courantes (par nom, par valeur et par besoin) produisent le même résultat, en ignorant les stratégies qui génèrent des erreurs ou des divergences.
Un programme est généralement dit fonctionnel lorsqu'il utilise certains concepts de programmation fonctionnelle, tels que les fonctions de première classe et les fonctions d'ordre supérieur. Cependant, une fonction de première classe n'a pas besoin d'être purement fonctionnelle, car elle peut utiliser des techniques du paradigme impératif, telles que des tableaux ou des méthodes d'entrée/sortie qui utilisent des cellules mutables, qui mettent à jour leur état en tant qu'effets secondaires. En fait, les premiers langages de programmation cités comme étant fonctionnels, IPL et Lisp$^,$, sont tous deux des langages fonctionnels "impurs" selon la définition de Sabry.
Les structures de données purement fonctionnelles sont persistantes. La persistance est nécessaire pour la programmation fonctionnelle; sans elle, le même calcul pourrait produire des résultats différents. La programmation fonctionnelle peut utiliser des structures de données permanentes non fonctionnelles, tandis que ces structures de données ne peuvent pas être utilisées dans des programmes purement fonctionnels.

## Propriétés de la programmation purement fonctionnelle
### Évaluation stricte ou non stricte

Chaque stratégie d'évaluation qui se termine sur un programme purement fonctionnel renvoie le même résultat. En particulier, cela garantit que le programmeur n'a pas à se préoccuper de l'ordre dans lequel les programmes sont évalués, car une évaluation anticipée renverra le même résultat qu'une évaluation paresseuse. Cependant, il est toujours possible qu'une évaluation anticipée ne se termine pas alors que l'évaluation paresseuse du même programme s'arrête. Un avantage de cela est que l'évaluation paresseuse peut être mise en œuvre beaucoup plus facilement ; comme toutes les expressions renvoient le même résultat à tout moment (indépendamment de l'état du programme), leur évaluation peut être retardée autant que nécessaire.

### Traitement en parallèle

La programmation purement fonctionnelle simplifie le calcul parallèle puisque deux parties purement fonctionnelles de l'évaluation n'interagissent jamais.

### Structures de données

Les structures de données purement fonctionnelles sont souvent représentées différemment de leurs équivalents impératifs. Par exemple, les tableaux avec un accès et une mise à jour en temps constant sont des composants de base de la plupart des langages impératifs, et de nombreuses structures de données impératives, telles que les tables de hachage et les tas binaires, sont basées sur des tableaux. Les tableaux peuvent être remplacés par des tableaux associatifs ou des listes d'accès aléatoire, qui permettent une implémentation purement fonctionnelle, mais l'accès et la mise à jour prennent un temps logarithmique. Par conséquent, les structures de données purement fonctionnelles peuvent être utilisées dans des langages qui ne sont pas fonctionnels, mais elles peuvent ne pas être l'outil le plus efficace disponible, surtout si la persistance n'est pas requise.
En général, la conversion d'un programme impératif en un programme purement fonctionnel nécessite également de s'assurer que les structures autrefois mutables sont maintenant explicitement renvoyées par les fonctions qui les mettent à jour, une structure de programme appelée store-passing style.

## Langage purement fonctionnel

Un langage purement fonctionnel est un langage qui n'admet que la programmation purement fonctionnelle. Les programmes purement fonctionnels peuvent cependant être écrits dans des langages qui ne sont pas purement fonctionnels.