StackOverflow hat mich hier gezeigt, daher könnte die Frage für Laien etwas zutreffend sein.
Wikipedia definiert reine Funktionen als
In der Computerprogrammierung kann eine Funktion als reine Funktion beschrieben werden, wenn beide Aussagen über die Funktion gelten:
- Die Funktion wertet immer den gleichen Ergebniswert bei gleichen Argumentwerten aus. Der Funktionsergebniswert kann weder von versteckten Informationen oder Zuständen abhängen, die sich im Verlauf der Programmausführung oder zwischen verschiedenen Programmausführungen ändern können, noch von externen Eingaben von E / A-Geräten.
- Die Auswertung des Ergebnisses verursacht keine semantisch beobachtbaren Nebenwirkungen oder Ausgaben, wie z. B. die Mutation veränderlicher Objekte oder die Ausgabe an E / A-Geräte.
Es scheint jedoch keine Quellen zu zitieren - daher ist es schwer zu sagen, ob dies eine akzeptierte Definition ist oder wer sie so definiert hat.
Wenn ich mir anschaue, was die Sprachen tun, wenn sie eine Syntax / Anmerkung für "reine" Funktionen enthalten, gibt es einige verschiedene Ansätze:
- In D ist die einzige Einschränkung die Nichtmutation des globalen Zustands. "Reine" Funktionen können ihre Argumente mutieren.
- In GCC gibt es zwei Arten von "rein":
pure
(keine Nebenwirkungen, kann aber den globalen Zustand lesen) undconst
(streng rein gemäß Wikipedia-Definition). - In C # ist definiert als "nimmt keine sichtbaren Zustandsänderungen vor" (was auch immer das ist).
- Haskell folgt der Wikipedia-Definition.
Meine Frage ist also: Gibt es eine kanonische Definition der reinen Funktion?
Und wenn ja, woher stammt sie?
terminology
functional-programming
semantics
Andrey Shchekin
quelle
quelle
Antworten:
Wie in diesem Artikel Imperative Functional Programming (1993) von Peyton-Jones und Wadler (aus der Gruppe der Forscher, die Haskell geschaffen haben) erwähnt:
Der Schwerpunkt liegt auf dem Fehlen von Nebenwirkungen, um Programmtransformationen (dh Compiler-Optimierungen) zu ermöglichen.
Was sind Nebenwirkungen? Dieses Papier verweist wiederum auf die Integration der funktionalen und imperativen Programmierung (1986) von Gifford und Lucassen, in der vier Arten von Effektklassen erwähnt werden : Pure, Function, Observer und Procedure. Der Begriff "reine Funktion" leitet sich also aus dieser Arbeit ab.
Beachten Sie jedoch, dass Peyton-Jones und Wadler Mängel in diesem Ansatz erwähnt haben. Bemerkenswert ist die Programmiersprache Clean , die lineare Typen verwendet, um Nebenwirkungen auf sichere Weise einzuführen (dh sicher für den Compiler). Grundsätzlich fädelt es die Welt als Variable in alle E / A-bezogenen Funktionen ein, einschließlich des Haupteinstiegspunkts .
Damit ist es möglich, dass eine reine funktionale Sprache mit der Welt interagiert und Nebenwirkungen hat (E / A, Betriebssystem, Fenstersystem usw.), die teilweise Ihrer Wikipedia-Definition widersprechen. Man kann tatsächlich sagen, dass Haskell Clean als einen seiner Einflussfaktoren hat; obwohl es von linearen Typen abweicht und ein anderes Konstrukt auf Typebene (Monaden) verwendet, um Linearität zu gewährleisten, dh jederzeit eine einzelne Referenz.
quelle
(f_handle, world2) = fopen file_name, world
(Pseudocode) ein nächster Aufruf verwendet werden mussworld2
. Im Wesentlichen wird davon ausgegangen, dass Programme auf das gesamte Universum angewendet werden. Anders ausgedrückt, es gibt keine Nebenwirkungen, wenn Sie im Universum operieren :-)Die Definition von Wikipedia ist kanonisch. Die zwei entscheidenden Anforderungen sind:
Der Rückgabewert und das Verhalten der Funktion sind eine deterministische Funktion der Argumente, die explizit an die Funktion übergeben wurden.
Ein Aufruf der Funktion hat keine beobachtbaren Nebenwirkungen.
Genau genommen sollten D und gcc das Wort "rein" nicht so verwenden, wie sie es tun. Es ist ein Missbrauch der Standardterminologie.
quelle