Programmation purement fonctionnelle

Un article de Wikipédia, l'encyclopédie libre.

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[modifier | modifier le code]

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[1].

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[2]. 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[3],[4], 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[modifier | modifier le code]

Évaluation stricte ou non stricte[modifier | modifier le code]

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[modifier | modifier le code]

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

Structures de données[modifier | modifier le code]

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[modifier | modifier le code]

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.

Références[modifier | modifier le code]

  1. Sabry, « What is a purely functional language? », Journal of Functional Programming, vol. 8, no 1,‎ , p. 1–22 (DOI 10.1017/S0956796897002943, CiteSeerx 10.1.1.27.7800)
  2. Luis Atencio, Functional Programming in Javascript, Manning Publications, (ISBN 978-1617292828)
  3. The memoir of Herbert A. Simon (1991), Models of My Life pp.189-190 (ISBN 0-465-04640-1) claims that he, Al Newell, and Cliff Shaw are "commonly adjudged to be the parents of [the] artificial intelligence [field]", for writing Logic Theorist, a program which proved theorems from Principia Mathematica automatically. In order to accomplish this, they had to invent a language and a paradigm which, which viewed retrospectively, embeds functional programming.
  4. McCarthy, « History of Lisp », In ACM SIGPLAN History of Programming Languages Conference,‎ , p. 217–223 (DOI 10.1145/800025.808387, lire en ligne)
  5. Simon Marlow, Parallel and Concurrent Programming in Haskell: Techniques for Multicore and Multithreaded Programming, O'Reilly Media, (ISBN 978-1449335946)