79 votes

Pureté vs transparence référentielle

Les termes ne semblent être défini différemment, mais j'ai toujours pensé que l'un impliquant l'autre; je ne peux pas penser à tous les cas lorsqu'une expression est referentially transparent mais pas pur, ou vice-versa.

Wikipédia maintient des articles distincts pour ces concepts et dit:

De la transparence Référentielle:

Si toutes les fonctions impliquées dans la expression sont de pures fonctions, puis l'expression est referentially transparent. Aussi, certains impur les fonctions peuvent être inclus dans le expression si leurs valeurs sont jeté et leurs effets secondaires sont insignifiant.

De Pures expressions:

Pure fonctions sont nécessaires pour construire pur expressions. [...] Pure les expressions sont souvent désignés comme des étant referentially transparent.

Je trouve ces déclarations à confusion. Si les effets secondaires d'une soi-disant "impure fonction" sont insignifiants suffisante pour permettre de ne pas l'effectuer eux (c'est à dire remplacer un appel à une fonction de ce genre avec sa valeur) sans vraiment changer de programme, c'est la même chose comme si elle était pure, en premier lieu, n'est-ce pas?

Est-il un moyen plus simple de comprendre les différences entre une expression pure et une referentially transparente, le cas échéant? Si il y a une différence, un exemple d'expression qui démontre clairement qu'il serait appréciée.

60voto

Norman Ramsey Points 115730

Si je rassemble en un seul lieu toutes les trois théoriciens de ma connaissance, au moins deux d'entre eux sont en désaccord sur le sens du terme "référentiel de transparence." Et quand j'étais un jeune étudiant, un de mes mentors m'a donné un papier expliquant que même si l'on considère seulement la littérature professionnelle, le membre de phrase "referentially transparent" est utilisé pour signifier au moins trois choses différentes. (Malheureusement, ce papier est quelque part dans une boîte de documents qui ne sont pas encore numérisés. J'ai cherché sur Google Scholar pour elle, mais je n'avais pas de succès.)

Je ne peux pas vous en informer, mais je peux vous conseiller d'abandonner Parce que même le petit cadre de proue à tête de langue théoriciens ne peuvent pas s'entendre sur ce que signifie le terme "referentially transparent" est pas utile. Donc ne l'utilisez pas.


P. S. Sur n'importe quel sujet à voir avec la sémantique des langages de programmation, Wikipédia n'est pas fiable. J'ai renoncé à essayer de le résoudre; le Wikipédien processus semble considérer le changement et populaire de vote sur la stabilité et la précision.

10voto

sclv Points 25335

Toutes les fonctions pures sont nécessairement referentially transparent. Puisque, par définition, ils ne peuvent pas accéder à autre chose que ce qu'ils sont passés, leur résultat doit être entièrement déterminée par leurs arguments.

Toutefois, il est possible d'avoir referentially transparente des fonctions qui ne sont pas purs. Je peux écrire une fonction qui étant donné un entier (int) i, puis génère un nombre aléatoire r, soustrait r de lui-même et le place dans s, puis revient en i - s. Clairement cette fonction est impur, parce que c'est la génération de nombres aléatoires. Cependant, il est referentially transparent. Dans ce cas, l'exemple est stupide et artificiel. Toutefois, dans, par exemple, Haskell, l' id fonction est de type a - > a alors que mes stupidId fonction serait de type a -> IO a indiquant qu'il fait usage d'effets secondaires. Lorsqu'un programmeur peut garantir par des moyens externes, preuve que leur fonction est en fait referentially transparent, alors ils peuvent utiliser unsafePerformIO de la bande de l' IO de retour à l'écart de ce type.

4voto

Artyom Shalkhakov Points 659

Je suis un peu incertain de la réponse que je donne ici, mais sûrement, quelqu'un va nous orienter dans une certaine direction. :-)

La "pureté", entend généralement par "l'absence d'effets secondaires". Une expression est dite pure si son évaluation manque d'effets secondaires. Qu'est ce qu'un effet secondaire, alors? Dans un but purement fonctionnel de la langue, des effets secondaires est quelque chose qui ne passe pas par le simple bêta-règle (la règle que pour évaluer la fonction de demande est le même que pour remplacer paramètre réel pour tous gratuit occurrences du paramètre formel).

Par exemple, dans un langage fonctionnel avec linéaire (ou de l'unicité, cette distinction ne devrait pas le déranger à ce moment) types de certains (contrôlée) de la mutation est autorisé.

Donc je suppose que nous avons trié ce que la "pureté" et "effets secondaires" peut-être.

La transparence référentielle (d'après Wikipedia, l'article que vous avez cité) signifie que la variable peut être remplacée par l'expression qu'elle désigne (abbréviations, représente), sans en modifier le sens du programme à la main (btw, c'est aussi une question difficile à aborder, et je ne vais pas tenter de le faire ici). Ainsi, la "pureté" et de "transparence référentielle" sont en effet des choses différentes: la "pureté" est une propriété de certaines expression signifie à peu près "ne produit pas d'effets secondaires lorsqu'il est exécuté", alors que "la transparence référentielle" est une propriété liée variable et d'expression qu'il représente et signifie "variable peut être remplacée avec ce qu'il désigne".

Espérons que cela aide.

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