Kann reine Funktionen globalen Zustand lesen?
-
03-07-2019 - |
Frage
Bitte beachten Sie: durch eine „reine“ Funktion, ich meine nicht „rein virtuelle“
Ich beziehe mich auf dieser
Wenn eine Funktion „liest“ einig globalen Zustand, ist, dass es unrein automatisch wiedergeben? oder ist sie von anderen Faktoren abhängen?
Wenn es automatisch unrein macht, bitte erklären, warum.
Wenn es von anderen Faktoren abhängt, bitte erklären, was sie sind.
Lösung
Eine „reine“ Funktion ist eine Funktion, deren Ergebnis hängt nur auf seine Eingabeargumente. Wenn es irgendetwas anderes liest, ist es nicht eine reine Funktion.
Andere Tipps
In bestimmten spezialisierten Instanzen, ja. wenn Sie einen globalen Cache von bereits berechneten Werten zum Beispiel, die von Ihrer Funktion nur gelesen und geschrieben wurde, wäre es immer noch mathematisch rein sein, in dem Sinne, dass der Ausgang nur an den Eingängen abhängig, aber es wäre nicht rein sein im engeren Sinne. Zum Beispiel:
static int cache[256] = {0};
int compute_something(uint8_t input)
{
if(cache[input] == 0)
cache[input] = (perform expensive computation on input that won't return 0);
return cache[input];
}
In diesem Fall, solange keine andere Funktion die globale cache
berührt, es ist immer noch eine mathematisch reine Funktion, obwohl es hängt technisch auf externen globalen Zustand. Aber dieser Zustand ist nur eine Performance-Optimierung -. Es wäre immer noch die gleiche Berechnung, ohne sie auszuführen, nur langsamer
Reine Funktionen erforderlich sind reine Ausdrücke zu konstruieren. Konstante Ausdrücke sind reine definitionsgemäß.
Also, wenn Ihr globalen ‚Staat‘ Sie ändert sich nicht, sind in Ordnung.
Siehe auch referentielle Transparenz :
Ein subtilere Beispiel ist, dass eine Funktion, die eine globale Variable verwendet (oder eine dynamisch scoped Variable oder eine lexikalische Schließung) es zu helfen, seine Ergebnisse zu berechnen. Da diese Variable nicht als Parameter übergeben wird, kann aber geändert werden, können die Ergebnisse der nachfolgenden Aufrufen der Funktion unterscheiden, auch wenn die Parameter identisch sind. (In der reinen funktionellen Programmierung, destruktiven Zuordnung ist nicht zulässig;. Also eine Funktion, die global verwendet (oder dynamisch scoped Variablen) noch referenziell transparent, da diese Variablen sich nicht ändern kann)
In Haskell zum Beispiel können Sie eine endlose Liste von Zufallszahlen auf der unreinen Seite erstellen und diese Liste Ihre reine Funktion übergeben. Die Implementierung wird erzeugt die nächste Nummer Ihrer reine Funktion nur verwenden, wenn sie braucht es, aber die Funktion ist noch rein.