StackOverflow m'a pointé ici, donc la question pourrait être un peu en termes simples.
Wikipedia définit les fonctions pures comme
En programmation informatique, une fonction peut être décrite comme une fonction pure si ces deux déclarations sur la fonction sont valables:
- La fonction évalue toujours la même valeur de résultat pour les mêmes valeurs d'argument. La valeur de résultat de la fonction ne peut dépendre d'aucune information ou état caché susceptible de changer au cours de l'exécution du programme ou entre différentes exécutions du programme, ni de toute entrée externe provenant de périphériques d'E / S.
- L'évaluation du résultat ne provoque aucun effet secondaire ou sortie sémantiquement observable, comme une mutation d'objets mutables ou une sortie vers des dispositifs d'E / S.
Cependant, il ne semble pas citer de sources - il est donc difficile de dire s'il s'agit d'une définition acceptée ou qui l'a définie de cette façon.
Quand je regarde ce que font les langages quand ils incluent une syntaxe / annotation pour les fonctions "pures", il y a pas mal d'approches différentes:
- En D, la seule limitation est la non-mutation de l'état global. Les fonctions "pures" peuvent muter ses arguments.
- Dans GCC, il existe deux types de "pur":
pure
(pas d'effets secondaires, mais peut lire l'état global) etconst
(strictement pur selon la définition de wikipedia). - En C # , il est défini comme "ne fait aucun changement d'état visible" (quel qu'il soit).
- Haskell suit la définition de Wikipedia.
Ma question est donc la suivante: existe-t-il une définition canonique de la fonction pure?
Et s'il y en a, quelle est sa source?
terminology
functional-programming
semantics
Andrey Shchekin
la source
la source
Réponses:
Comme indiqué dans cet article Imperative Functional Programming , (1993) par Peyton-Jones et Wadler (parmi le groupe de chercheurs qui a créé Haskell):
l'accent est mis sur l'absence d'effets secondaires pour permettre les transformations de programme (c'est-à-dire les optimisations du compilateur).
Quels sont les effets secondaires? Cet article pointe à son tour vers la programmation fonctionnelle et impérative (1986) de Gifford et Lucassen, qui mentionne quatre types de classes d'effets : Pure, Function, Observer et Procedure. Ainsi, le terme «fonction pure» dérive de cet article.
Notez, cependant, que Peyton-Jones et Wadler ont mentionné des lacunes dans cette approche. Il convient de noter, disent-ils, que le langage de programmation Clean utilise des types linéaires pour introduire les effets secondaires de manière sûre (c'est-à-dire sans danger pour le compilateur). Fondamentalement, il enfile le monde en tant que variable dans toutes les fonctions liées aux E / S, y compris le point d'entrée principal .
Avec cela, il est possible d'avoir un langage fonctionnel pur interagissant avec le monde et ayant des effets secondaires (E / S, OS, système de fenêtrage, etc.), contredisant partiellement votre définition wikipedia. On peut en fait dire que Haskell a Clean comme l'un de ses influenceurs; bien qu'il s'écarte des types linéaires et utilise une autre construction de niveau type (monades) pour garantir la linéarité, c'est-à-dire une référence unique à tout moment.
la source
(f_handle, world2) = fopen file_name, world
(pseudocode) et qu'un prochain appel devra utiliserworld2
. En substance, les programmes sont perçus comme fonctionnant sur l' Univers dans son ensemble. Autrement dit, il n'y a pas d'effets secondaires lorsque vousLa définition de Wikipédia est canonique. Les deux exigences cruciales sont:
La valeur de retour et le comportement de la fonction sont une fonction déterministe des arguments qui ont été explicitement passés à la fonction.
Une invocation de la fonction n'a pas d'effets secondaires observables.
À strictement parler, D et gcc ne devraient pas utiliser le mot «pur» comme ils le font; c'est un abus de terminologie standard.
la source