Question

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 où une expression est transparente, mais référentielle pas pur, ou vice-versa.

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

De transparence référentielle :

Si toutes les fonctions impliquées dans la expression sont des fonctions pures, puis l'expression est référentiellement transparent. En outre, certains impure les fonctions peuvent être incluses dans le expression si leurs valeurs sont mis au rebut et leurs effets secondaires sont insignifiante.

De expressions pures:

Fonctions pures sont nécessaires pour construire des expressions pures. [...] pur expressions sont souvent appelés étant référentiellement transparent.

Je trouve ces déclarations confuses. Si les effets secondaires d'une soi-disant « fonction impure » sont insignifiants assez pour ne pas leur permettre d'effectuer (par exemple remplacer un appel à une telle fonction avec son valeur ) sans matériellement changer le programme, il est le même que si elle était pur, en premier lieu, non?

Y at-il un moyen plus simple de comprendre les différences entre une expression pure et une transparence référentielle, le cas échéant? S'il y a une différence, une expression exemple qui démontre clairement qu'il serait apprécié.

Était-ce utile?

La solution

Si je crois en un seul endroit les trois théoriciens de ma connaissance, au moins deux d'entre eux sont en désaccord sur la signification du terme « transparence référentielle ». Et quand j'étais jeune étudiant, mon mentor m'a donné un document expliquant que même si l'on considère que la littérature professionnelle, l'expression « référentielle transparente », on entend au moins trois choses différentes. (Malheureusement, ce papier est quelque part dans une boîte de réimpressions qui restent à analyser. J'ai cherché Google Scholar pour elle, mais je pas eu de succès.)

Je ne peux pas vous dire, mais je peut vous conseille de renoncer: Parce que même le petit cadre des théoriciens de la langue-headed pointues ne peut pas se mettre d'accord sur ce que cela signifie, le terme « référentielle transparent » pas utile . Donc, ne pas l'utiliser.


P.S. Sur un sujet pour faire avec la sémantique des langages de programmation, Wikipedia est peu fiable. J'ai renoncé à essayer de le réparer; le processus Wikipédien semble changement concernant le vote et populaire sur la stabilité et la précision.

Autres conseils

Toutes les fonctions pures sont nécessairement transparentes référentielle. Depuis, par définition, ils ne peuvent rien d'accès autre que ce qu'ils sont passés, leur résultat doit être entièrement déterminé par leurs arguments.

Cependant, il est possible d'avoir des fonctions transparentes référentielle qui ne sont pas pures. Je peux écrire une fonction qui est donné un entier i, puis génère un nombre aléatoire r, soustraient r de lui-même et le place dans s, puis retourne i - s. Il est clair que cette fonction est impur, car il génère des nombres aléatoires. Cependant, il est transparent référentielle. Dans ce cas, l'exemple est stupide et artificiel. Cependant, dans, par exemple, Haskell, la fonction id est de type a - > a alors que ma fonction stupidId serait de type a -> IO a indiquant qu'il utilise des effets secondaires. Quand un programmeur peut garantir par l'intermédiaire d'une preuve externe et que leur fonction est en fait référentiellement transparent, alors ils peuvent utiliser unsafePerformIO pour dépouiller les IO arrière loin de la nature.

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

« Pureté » est généralement considéré comme signifiant « absence d'effets secondaires ». Une expression est dit être pur si l'évaluation n'a pas d'effets secondaires. Qu'est-ce qu'un effet secondaire alors? Dans un langage purement fonctionnel, effet secondaire est tout ce qui ne va pas par la simple règle bêta (la règle pour évaluer l'application de la fonction est la même que celle de remplacer le paramètre réel pour toutes les occurrences libres du paramètre formel).

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

Je suppose que nous avons réglé ce que la « pureté » et « effets secondaires » pourrait être.

transparence référentielle (selon l'article de Wikipedia vous citiez) signifie que la variable peut être remplacée par l'expression qu'elle représente (abrège, signifie) sans changer le sens du programme à portée de main (BTW, c'est aussi une question difficile à agrès, et je ne vais pas tenter de le faire ici). Ainsi, la « pureté » et « transparence référentielle » sont en effet des choses différentes: la « pureté » est une propriété d'une expression à peu près moyen « ne produit pas d'effets secondaires lors de l'exécution », alors que la « transparence référentielle » est une variable relative propriété et d'expression il représente et signifie « variable peut être remplacée par ce qu'il représente ».

Espérons que cela aide.

Ces diapositives d'un talk ACCU2015 un grand résumé sur le thème de la transparence référentielle.

A partir de l'une des diapositives:

langue A est référentiellement transparent si (a) chaque sous-expression peut être remplacé par tout autre Cela équivaut à lui en valeur et (b) toutes les occurrences de une expression dans un rendement de contexte donné la même valeur.

Vous pouvez avoir, par exemple, une fonction qui enregistre son calcul au programme de sortie standard (donc, il ne sera pas une fonction pure), mais vous pouvez remplacer les appels à cette fonction par une fonction similaire qui ne log son calcul. Par conséquent, cette fonction ont la transparence référentielle propriété. Mais ... la définition ci-dessus est sur les langues, pas les expressions, les diapositives soulignent.

[...] il est le même que si elle était pur, en premier lieu, est-ce pas?

D'après les définitions que nous avons, non, ce n'est pas.

Y at-il un moyen plus simple de comprendre les différences entre une expression pure et un transparent référentielle, le cas échéant?

Essayez les diapositives que je mentionnés ci-dessus .

Je vais citer ce que John Mitchell a écrit dans son livre des langues. Je ne me souviens pas ligne par ligne mais il définit pur langage fonctionnel doit passer le test de langage déclaratif qui est:

"Dans le cadre de la décélération spécifique de x1, ..., xn, tout événement d'une expression e ne contenant que les variables x1, ..., XN ont la même valeur."

En bref comme tout le monde dit exempt d'effets secondaires ou pas d'effets secondaires ( « manque » d'effets secondaires).

En linguistique une phrase nom ou nom est considéré comme transparent référentielle si elle peut être remplacée par l'autre syntagme avec la même référent sans changer le sens de la phrase qu'il contient.

Ce qui dans le 1er cas, mais tient en 2ème cas, il est trop bizarre.

Cas n ° 1: "J'ai vu Walter entrer dans son nouveau voiture ."

Et si Walter possède un Centro, nous pourrions alors le remplacer dans la phrase donnée comme:

"J'ai vu Walter obtenir dans son Centro "

Contrairement à d'abord:

Cas n ° 2:. Il a été appelé William Rufus à cause de sa lecture barbe

Rufus signifie un peu rouge et référence était à William IV d'Angleterre.

"Il a été appelé William IV à cause de sa barbe de lecture." semble trop maladroit.

façon traditionnelle à dire est, une langue est transparente référentielle si l'on peut remplacer une expression par une autre de valeur égale partout dans le programme sans changer le sens du programme.

Ainsi, la transparence référentielle est une propriété de langage fonctionnel pur. Et si votre programme est exempt d'effets secondaires, cette propriété se bloquera.

Alors, donnez-le est génial, mais des conseils obtenir sur pourrait aussi bien paraître dans ce contexte.

scroll top