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.

War es hilfreich?

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.

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