Frage

Die Begriffe scheinen zu sein definiert anders, aber ich habe immer an einen gedacht, was den anderen impliziert; Ich kann mir keinen Fall vorstellen, wenn ein Ausdruck referentiell transparent, aber nicht rein oder umgekehrt ist.

Wikipedia unterhält getrennte Artikel für diese Konzepte und sagt:

Aus Referenztransparenz:

Wenn alle an der Expression beteiligten Funktionen reine Funktionen sind, ist der Ausdruck referentiell transparent. Außerdem können einige unreine Funktionen in den Ausdruck einbezogen werden, wenn ihre Werte verworfen werden und ihre Nebenwirkungen unbedeutend sind.

Aus Reine Ausdrücke:

Reine Funktionen sind erforderlich, um reine Ausdrücke zu konstruieren. [...] reine Ausdrücke werden oft als referentiell transparent bezeichnet.

Ich finde diese Aussagen verwirrend. Wenn die Nebenwirkungen einer sogenannten "unreinen Funktion" sind unbedeutend genug, um sie nicht auszuführen (dh ersetzen Sie einen Aufruf einer solchen Funktion durch seine Funktion Wert) Ohne das Programm materiell zu ändern, ist es dasselbe, als wäre es überhaupt rein, nicht wahr?

Gibt es eine einfachere Möglichkeit, die Unterschiede zwischen einem reinen und einer referentiell transparenten Unterschiede zu verstehen, wenn überhaupt? Wenn es einen Unterschied gibt, zeigt ein Beispielausdruck, der deutlich zeigt, dass dies geschätzt wird.

War es hilfreich?

Lösung

Wenn ich an einem Ort drei Theoretiker meiner Bekannten versammle, sind mindestens zwei von ihnen der Bedeutung des Begriffs "Referenztransparenz" nicht einverstanden. Und als ich ein junger Schüler war, gab mir ein Mentor von mir ein Papier, in dem es erklärt, dass der Ausdruck "Referenty transparent", selbst wenn Sie nur die professionelle Literatur betrachten, mindestens drei verschiedene Dinge bedeutet. (Leider befindet sich dieses Papier irgendwo in einer Schachtel mit Nachdrucken, die noch nicht gescannt wurden. Ich habe Google Scholar danach durchsucht, aber ich hatte keinen Erfolg.)

Ich kann dich nicht informieren, aber ich kann Raten Sie auf, aufzugeben: Weil selbst der winzige Kader der spitzköpfigen Sprachtheoretiker nicht zustimmen können, was er bedeutet, ist der Begriff "referentiell transparent" Nicht nützlich. Also benutze es nicht.


PS zu jedem Thema, das mit der Semantik von Programmiersprachen zu tun hat, ist Wikipedia unzuverlässig. Ich habe es aufgegeben, es zu reparieren; Der Wikipedian -Prozess scheint Veränderungen und die populäre Abstimmung über Stabilität und Genauigkeit zu betrachten.

Andere Tipps

Alle reinen Funktionen sind notwendigerweise transparent. Da sie per Definition nicht auf etwas anderes zugreifen können als das, was sie verabschiedet werden, muss ihr Ergebnis vollständig durch ihre Argumente bestimmt werden.

Es ist jedoch möglich, referentiell transparente Funktionen zu haben, die nicht rein sind. Ich kann eine Funktion schreiben, die ein int erhält i, generiert dann eine Zufallszahl r, Subtrahiere r von sich selbst und platziert es hinein s, dann kehrt zurück i - s. Diese Funktion ist eindeutig unrein, da sie zufällige Zahlen generiert. Es ist jedoch referentiell transparent. In diesem Fall ist das Beispiel albern und erfunden. In jedoch, z. B. Haskell, die id Funktion ist vom Typ a - > a während mein stupidId Funktion wäre vom Typ a -> IO a Angeben, dass es Nebenwirkungen verwendet. Wenn ein Programmierer durch einen externen Beweis garantieren kann, dass seine Funktion tatsächlich referentiell transparent ist, können sie verwenden unsafePerformIO um das zu entfernen IO Zurück vom Typ.

Ich bin mir der Antwort, die ich hier gebe, etwas nicht sicher, aber sicherlich wird uns jemand in eine Richtung verweisen. :-)

"Reinheit" wird allgemein als "Mangel an Nebenwirkungen" betrachtet. Ein Ausdruck soll rein sein, wenn seine Bewertung keine Nebenwirkungen hat. Was ist dann ein Nebeneffekt? In einer rein funktionalen Sprache ist die Nebenwirkung alles, was nicht durch die einfache Beta-Rule entsteht (die Regel, die zur Bewertung der Funktionsanwendung identisch ist, wie es den tatsächlichen Parameter für alle freien Vorkommen des formalen Parameters ersetzt).

In einer funktionalen Sprache mit linearer (oder Einzigartigkeit sollte sich diese Unterscheidung in diesem Moment nicht stören), ist eine (kontrollierte) Mutation zulässig.

Ich denke, wir haben herausgegeben, was "Reinheit" und "Nebenwirkungen" sein könnten.

Referenziell -Transparenz (gemäß dem von Ihnen angeführten Artikel von Wikipedia) bedeutet, dass Variable durch den Ausdruck ersetzt werden kann, für den es (Abkürzes, für) steht, ohne die Bedeutung des vorliegenden Programms zu ändern (übrigens, dies ist auch eine schwierige Frage, um sie anzugehen, und dies ist auch eine schwierige Frage, und es ist auch eine schwierige Frage, und die Angriffe und dies ist auch eine schwierige Frage, und es ist Ich werde hier nicht versuchen, dies zu tun). "Reinheit" und "referenzielle Transparenz" sind also in der Tat unterschiedliche Dinge: "Reinheit" ist eine Eigenschaft eines Ausdrucks, das in etwa "Nebenwirkungen" bei der Ausführung "referenziell transparent" ist, die eine Eigenschaft über Variable und Ausdruck ist Es steht für und bedeutet "Variable kann durch das ersetzt werden, was es bezeichnet".

Hoffentlich hilft das.

Diese Folien von einem ACCU2015 -Talk eine großartige Zusammenfassung zum Thema referenzieller Transparenz.

Aus einem der Folien:

Eine Sprache ist referentiell transparent, wenn (a) jede Unterexpression durch jedes andere ersetzt werden kann, der ihm im Wert entspricht, und (b) alle Vorkommen eines Ausdrucks innerhalb eines bestimmten Kontextes denselben Wert liefern.

Sie können beispielsweise eine Funktion haben, die ihre Berechnung bei der Programmstandardausgabe protokolliert (so dass sie keine reine Funktion ist), aber Sie können Aufrufe für diese Funktion durch eine ähnliche Funktion ersetzen, die ihre Berechnung nicht protokolliert . Daher hat diese Funktion die Referenztransparenz Eigentum. Aber ... in der obigen Definition geht es um Sprachen, nicht um Ausdrücke, wie die Folien betonen.

...] Es ist das gleiche, als wäre es überhaupt rein rein, nicht wahr?

Aus den Definitionen, die wir haben, nein, ist es nicht.

Gibt es eine einfachere Möglichkeit, die Unterschiede zwischen einem reinen und einer referentiell transparenten Unterschiede zu verstehen, wenn überhaupt?

Versuchen Die Folien, die ich oben erwähnt habe.

Ich werde zitieren, was John Mitchell in seinem Buch geschrieben hat Konzept in der Programmiersprache. Ich erinnere mich nicht an die Zeile für Zeile, aber er definiert reine funktionale Sprache, muss deklarative Sprachtest bestehen, nämlich:

"Im Rahmen der spezifischen Verzögerung von x1, ..., xn, das gesamte Auftreten eines Ausdrucks E, der nur Variablen x1, ..., xn enthält, haben den gleichen Wert."

Kurz gesagt, wie alle anderen frei von Nebenwirkungen oder keine Nebenwirkungen ("Mangel an Nebenwirkungen) erwähnt haben.

In der Linguistik wird ein Name oder Substantivphrase als referentiell transparent angesehen, wenn er durch die andere Substantivphrase durch denselben Referenten ersetzt werden kann, ohne die Bedeutung des Satzes zu ändern, den er enthält.

Was im 1. Fall gilt, aber im 2. Fall wird es zu seltsam.

Fall 1: "Ich habe gesehen, wie Walter in seine neue gestiegen ist Wagen."

Und wenn Walter ein Centro besitzt, könnten wir das in dem gegebenen Satz ersetzen wie:

"Ich habe gesehen, wie Walter in seine gekommen ist Centro"

Im Gegensatz zum ersten Mal:

Fall 2: Er wurde gerufen William Rufus Wegen seines Lesebartes.

Rufus bedeutet etwas rot und es wurde auf William IV von England bezeichnet.

"Er wurde gerufen William IV Wegen seines Lesebartes. "Sieht zu umständlich aus.

Die traditionelle Art zu sagen ist, dass eine Sprache referentiell transparent ist, wenn wir einen Ausdruck durch einen anderen von einem gleichen Wert überall im Programm ersetzen können, ohne die Bedeutung des Programms zu ändern.

Referenztransparenz ist also eine Eigenschaft der reinen funktionalen Sprache. Und wenn Ihr Programm frei von Nebenwirkungen ist, gilt diese Eigenschaft.

Geben Sie es also auf ein großartiger Rat, aber in diesem Zusammenhang sehen Sie es auch gut aus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top