Transparence entre pureté et référentiel

Les termes semblent être définis différemment, mais j’ai toujours pensé à l’un impliquant l’autre; Je ne peux penser à aucun cas lorsqu’une expression est référentielle transparente mais pas pure, ou vice versa.

Wikipedia maintient des articles séparés pour ces concepts et dit:

De la transparence référentielle :

Si toutes les fonctions impliquées dans l’expression sont des fonctions pures, l’expression est transparente par référence. En outre, certaines fonctions impures peuvent être incluses dans l’expression si leurs valeurs sont ignorées et leurs effets secondaires non significatifs.

Des expressions pures :

Les fonctions pures sont nécessaires pour construire des expressions pures. […] Les expressions pures sont souvent désignées comme étant référentiellement transparentes.

Je trouve ces déclarations confuses. Si les effets secondaires d’une soi-disant “fonction impure” sont insignifiants pour permettre de ne pas les exécuter (c.-à-d. Remplacer un appel à une telle fonction par sa valeur ) sans changer matériellement le programme, c’est comme si première place, n’est-ce pas?

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

    Si je rassemble au moins trois théoriciens de ma connaissance, au moins deux d’entre eux ne sont pas d’accord sur la signification de l’expression «transparence référentielle». Et quand j’étais jeune étudiant, un de mes mentors m’a donné un papier expliquant que même si l’on ne considère que la littérature professionnelle, l’expression “référentiellement transparent” signifie au moins trois choses différentes. (Malheureusement, ce papier est quelque part dans une boîte de réimpressions qui n’ont pas encore été scannées. J’ai cherché Google Scholar mais je n’ai pas réussi.)

    Je ne peux pas vous informer, mais je peux vous conseiller d’abandonner: Parce que même le petit groupe de théoriciens du langage pointu ne peut pas s’entendre sur ce que cela signifie, le terme «référentiellement transparent» n’est pas utile . Donc ne l’utilisez pas.


    PS Sur n’importe quel sujet lié à la sémantique des langages de programmation, Wikipedia n’est pas fiable. J’ai cessé d’essayer de le réparer; le processus Wikipédien semble considérer le changement et le vote populaire sur la stabilité et la précision.

    Toutes les fonctions pures sont nécessairement transparentes. Comme, par définition, ils ne peuvent pas accéder à autre chose qu’à ce qu’ils ont reçu, leur résultat doit être entièrement déterminé par leurs arguments.

    Cependant, il est possible d’avoir des fonctions transparentes qui ne sont pas pures. Je peux écrire une fonction qui reçoit un int i , puis génère un nombre aléatoire r , soustrait r de lui-même et le place dans s , puis renvoie i - s . Clairement, cette fonction est impure, car elle génère des nombres aléatoires. Cependant, il est référentiel transparent. 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’elle utilise des effets secondaires. Lorsqu’un programmeur peut garantir, par le biais d’une preuve externe, que sa fonction est en réalité transparente de manière référentielle, il peut alors utiliser unsafePerformIO pour unsafePerformIO l’ IO du type.

    Je ne suis pas certain de la réponse que je donne ici, mais sûrement quelqu’un nous indiquera une direction. 🙂

    La “pureté” est généralement considérée comme signifiant “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 langage purement fonctionnel, les effets secondaires sont tout ce qui ne va pas avec la simple règle bêta (la règle d’évaluer l’application de la fonction est la même que celle de substituer le paramètre réel à toutes les occurrences libres du paramètre formel).

    Par exemple, dans un langage fonctionnel avec linéarité (ou unicité, cette distinction ne devrait pas être gênante pour le moment), certaines mutations (contrôlées) sont autorisées.

    Donc, je suppose que nous avons sortingé ce que “pureté” et “effets secondaires” pourraient être.

    La transparence référentielle (selon l’article de Wikipédia que vous avez cité) signifie que la variable peut être remplacée par l’expression (abréviation, abréviation) sans changer le sens du programme (bien sûr, c’est aussi une question difficile à traiter). Je ne vais pas essayer de le faire ici). Ainsi, la “pureté” et la “transparence référentielle” sont en effet des choses différentes: la “pureté” est une propriété d’une expression qui signifie grossièrement “ne produit pas d’effets secondaires” alors que la “transparence référentielle” est une variable cela signifie et signifie que «la variable peut être remplacée par ce qu’elle désigne».

    Espérons que cela aide.

    Ces diapositives d’une conférence ACCU2015 résument bien le sujet de la transparence référentielle.

    De l’une des diapositives:

    Un langage est référentiellement transparent si (a) chaque sous-expression peut être remplacée par une autre qui lui est égale en valeur et (b) toutes les occurrences d’une expression dans un contexte donné produisent la même valeur.

    Vous pouvez avoir, par exemple, une fonction qui enregistre son calcul sur la sortie standard du programme (ce ne sera donc pas une fonction pure), mais vous pouvez remplacer les appels pour cette fonction par une fonction similaire qui ne consigne pas son calcul . Par conséquent, cette fonction a la propriété de transparence référentielle . Mais … la définition ci-dessus concerne les langues, pas les expressions, comme le soulignent les diapositives.

    […] c’est comme si c’était pur au départ, n’est-ce pas?

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

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

    Essayez les diapositives que j’ai mentionnées ci-dessus .

    Je citerai ce que John Mitchell a écrit dans son livre Concept in langage de programmation . Je ne m’en souviens pas ligne par ligne mais il définit le langage fonctionnel pur qui doit passer le test de langue déclaratif qui est:

    “Dans le cadre de la décélération spécifique de x1, …, xn, toute occurrence d’une expression e contenant uniquement les variables x1, …, xn a la même valeur.”

    En bref, comme tout le monde l’a mentionné, sans effets secondaires ou sans effets secondaires («absence d’effets secondaires»).

    En linguistique, un nom ou un syntagme nominal est considéré comme référentiellement transparent s’il peut être remplacé par un autre syntagme nominal ayant le même référent sans changer le sens de la phrase qu’il contient.

    Ce qui dans le premier cas tient, mais dans le deuxième cas, il devient trop étrange.

    Cas 1: “J’ai vu Walter monter dans sa nouvelle voiture .”

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

    “J’ai vu Walter entrer dans son Centro

    Contrairement à la première:

    Cas n ° 2: Il s’appelait William Rufus à cause de sa barbe de lecture.

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

    “Il a été appelé William IV à cause de sa barbe lue.” semble trop gênant.

    La manière traditionnelle de dire est que le langage est référentiellement transparent si nous pouvons remplacer une expression par une autre de valeur égale n’importe où dans le programme sans changer la signification du programme.

    La transparence référentielle est donc une propriété du langage fonctionnel pur. Et si votre programme est exempt d’effets secondaires, alors cette propriété tiendra.

    Alors, abandonner est un bon conseil, mais le faire peut aussi sembler bon dans ce contexte.