64 votes

Langage fonctionnel pur : Haskell

Haskell a été qualifié de "langage fonctionnel pur". Que signifie "pur" dans ce contexte ? Quelles conséquences cela a-t-il pour un programmeur ?

64voto

Joel Spolsky Points 22686

Dans un pur Dans un langage fonctionnel, on ne peut rien faire qui ait un effet secondaire.

Un effet secondaire signifierait que l'évaluation d'une expression modifie un état interne qui ferait que l'évaluation de la même expression aurait un résultat différent. Dans un langage fonctionnel pur, vous pouvez évaluer la même expression aussi souvent que vous le souhaitez avec les mêmes arguments, et elle renverra toujours la même valeur, car il n'y a pas d'état à modifier.

Par exemple, un langage fonctionnel pur ne peut pas avoir d'opérateur d'affectation ni faire d'entrée/sortie, bien qu'à des fins pratiques, même les langages fonctionnels purs appellent souvent des bibliothèques impures pour faire des entrées/sorties.

36voto

ephemient Points 87003

"Pur" et "fonctionnel" sont deux concepts distincts, bien que l'un ne soit pas très utile sans l'autre.

Une expression pure est idempotente : elle peut être évaluée un nombre quelconque de fois, avec des résultats identiques à chaque fois. Cela signifie que l'expression ne peut pas avoir d'effets secondaires observables. Par exemple, si une fonction modifie ses arguments, définit une variable quelque part ou change de comportement en fonction de quelque chose d'autre que sa seule entrée, alors cet appel de fonction n'est pas pur.

Un langage de programmation fonctionnel est un langage dans lequel les fonctions sont de première classe. En d'autres termes, vous pouvez manipuler les fonctions avec exactement la même facilité que celle avec laquelle vous pouvez manipuler toutes les autres valeurs de première classe. Par exemple, il serait facile, dans un langage de programmation fonctionnel, d'utiliser une "fonction renvoyant un bool" comme "structure de données représentant un ensemble".

La programmation dans les langages de programmation fonctionnelle est souvent effectuée dans un style essentiellement pur, et il est difficile d'être strictement pur sans la manipulation de fonctions d'ordre supérieur permise par les langages de programmation fonctionnelle.

Haskell est un langage de programmation fonctionnel, dans lequel (presque) toutes les expressions sont pures ; Haskell est donc un langage de programmation purement fonctionnel.

24voto

Chuck Points 138930

Une fonction pure est une fonction qui n'a pas d'effets secondaires - elle prend une valeur en entrée et renvoie une valeur en sortie. Il n'y a pas d'état global que les fonctions modifient. Un langage fonctionnel pur est un langage qui oblige les fonctions à être pures. La pureté a un certain nombre de conséquences intéressantes, comme le fait que l'évaluation peut être paresseuse - puisqu'un appel de fonction n'a d'autre but que de retourner une valeur, il n'est pas nécessaire d'exécuter la fonction si vous n'avez pas l'intention d'utiliser sa valeur. Grâce à cela, des choses comme les fonctions récursives sur des listes infinies sont courantes en Haskell.

Une autre conséquence est que l'ordre dans lequel les fonctions sont évaluées n'a pas d'importance : comme elles ne peuvent pas s'influencer mutuellement, vous pouvez les exécuter dans l'ordre qui vous convient. Cela signifie que certains des problèmes posés par la programmation parallèle n'existent tout simplement pas, puisqu'il n'y a pas de "mauvais" ou de "bon" ordre d'exécution des fonctions.

15voto

Gilles Points 37537

À proprement parler, un pur Un langage fonctionnel est un langage fonctionnel (c'est-à-dire un langage où les fonctions sont des valeurs de première classe) où les expressions n'ont pas d'effets secondaires. L'expression "langage purement fonctionnel" est synonyme.

Selon cette définition, Haskell n'est pas un langage fonctionnel pur. Tout langage dans lequel vous pouvez écrire des programmes qui affichent leur résultat, lire et écrire des fichiers, avoir une interface graphique, etc. n'est pas purement fonctionnel. Ainsi, aucun langage de programmation à usage général n'est purement fonctionnel (mais il existe des langages purement fonctionnels utiles et spécifiques à un domaine : ils peuvent généralement être considérés comme des langages intégrés d'une certaine manière).

Il existe un sens utile et détendu dans lequel des langages comme Haskell et Erlang peuvent être considérés comme purement fonctionnels, mais pas des langages comme ML et Scheme. Un langage peut être considéré comme purement fonctionnel s'il existe un sous-ensemble raisonnablement large, utile et bien caractérisé où les effets secondaires sont impossibles. Par exemple, en Haskell, tous les programmes dont le type n'est pas construit à partir de IO ou toute autre monade dénotant un effet sont sans effet secondaire. En Erlang, tous les programmes qui n'utilisent pas de bibliothèques induisant des entrées-sorties ou des fonctionnalités de concurrence sont sans effets secondaires (c'est plus extensible que le cas de Haskell). Inversement, en ML ou Scheme, un effet secondaire peut être caché dans n'importe quelle fonction.

Dans cette perspective, le sous-ensemble purement fonctionnel de Haskell peut être considéré comme le langage intégré pour traiter le comportement à l'intérieur de chaque monade (bien sûr, c'est une perspective étrange, car presque tous les calculs se déroulent dans ce sous-ensemble "intégré"), et le sous-ensemble purement fonctionnel d'Erlang peut être considéré comme le langage intégré pour traiter le comportement local.


Graham Hutton a un point de vue légèrement différent, et assez intéressant, sur le sujet des les langages purement fonctionnels :

Parfois, le terme "purement fonctionnel" est également utilisé dans un sens plus large pour désigner des langages qui peuvent incorporer des effets informatiques, mais sans altérer la notion de "fonction" (comme en témoigne le fait que les propriétés essentielles des fonctions sont préservées). En général, l'évaluation d'une expression peut donner lieu à une "tâche", qui est ensuite exécutée séparément pour produire des effets de calcul. Les phases d'évaluation et d'exécution sont séparées de manière à ce que la phase d'évaluation ne compromette pas les propriétés standard des expressions et des fonctions. Les mécanismes d'entrée/sortie de Haskell, par exemple, sont de ce type.

C'est-à-dire qu'en Haskell, une fonction a le type a -> b et ne peut pas avoir d'effets secondaires. Une expression de type IO (a -> b) peut avoir des effets secondaires, mais ce n'est pas une fonction. Ainsi en Haskell les fonctions doivent être pures, donc Haskell est purement fonctionnel.

4voto

Marcus Fritzsch Points 3676

Comme il ne peut y avoir d'effets secondaires dans un code fonctionnel pur, les tests sont beaucoup plus faciles car il n'y a pas d'état externe à contrôler ou à vérifier. De plus, de ce fait, l'extension du code peut devenir plus facile.

J'ai perdu le compte du nombre de fois où j'ai eu des problèmes avec des effets secondaires non évidents en étendant/corrigeant (ou en essayant de corriger) du code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X