Today () ist eine unreine Funktion, weil ihr Ergebnis von etwas abhängt, das Sie ihm nicht geben. Insbesondere die aktuelle Systemzeit. Daher ist das Ergebnis nicht deterministisch, wenn es nur auf den beim Aufruf bereitgestellten Eingaben basiert.
Eine reine Funktion wäre int Add(int a, int b) {return a + b;}
. Die Funktion arbeitet ausschließlich mit dem, was sie enthält, und verwendet keine anderen externen Zustandsdaten. Das natürliche Ergebnis davon ist, dass Sie Add(2,2)
von jetzt an bis zum Ende der Zeit 4 bekommen können. Da die Funktion keinen externen Status ändert (es gibt keine "Nebenwirkungen"), ändert das Hinzufügen von 2 und 2 von jetzt an bis zum Ende der Zeit nichts anderes im System, es sei denn, Sie ändern dies Weisen Sie das Ergebnis der Funktion einer Variablen zu, oder verwenden Sie den Wert auf andere Weise, um den Status zu aktualisieren (was keine von der Funktion selbst ausgeführte Operation ist). Praktisch alle klassischen mathematischen Operationen sind reine Funktionen und können als solche implementiert werden.
Auf der anderen Seite kann Today () denselben Wert erzeugen, wenn es zweimal hintereinander aufgerufen wird, aber nicht, wenn es mehrere Tage lang wiederholt aufgerufen wird. Dies liegt daran, dass es von externen Statusdaten abhängt, die Sie nicht als Parameter für die Funktion angegeben haben. Infolgedessen ist es innerhalb der Programmgrenzen unmöglich, das Ergebnis der Today () - Funktion zu steuern. Es wird an einem bestimmten Tag einen bestimmten Wert und an keinem anderen Tag einen bestimmten Wert erzeugen, es sei denn, Sie ändern die Systemuhr des Computers, auf dem es ausgeführt wird (eine Änderung, die im Allgemeinen außerhalb der Programmgrenzen auftritt).
Eine unreine Funktion ist nicht unbedingt eine schlechte Sache; Selbst in funktionalen Sprachen sind unreine Funktionen erforderlich, um mit etwas außerhalb der Programmgrenzen zu interagieren, z. B. mit Datenspeichern, Kommunikations-Pipelines, Benutzeroberflächenanzeigen, Peripheriegeräten usw. Ein Programm, das keine dieser Funktionen ausführt, ist ein Programm das ist in seiner Nützlichkeit scharf begrenzt; Ich würde sogar so weit gehen, ein solches Programm als trivial zu bezeichnen, da es, ohne irgendwelche Mittel, um Eingaben zu akzeptieren oder um Sie über seine Ausgabe zu informieren, genauso gut nichts tun könnte. In funktionalen Sprachen geschriebene Programme können nur die von der Laufzeit bereitgestellten Eingaben haben und eine Ausgabe erzeugen, die der Laufzeit ohne explizit definierte unreine Methoden gemeldet wird. Dies liegt jedoch daran, dass die Laufzeit all diese unreinen Details der Arbeit in einem unvollkommenen Computersystem abstrahiert.
Es ist einfach eine sehr gute Sache zu wissen, welche der von Ihnen verwendeten Funktionen rein sind und welche nicht, damit Sie gute Entscheidungen darüber treffen können, wie sie verwendet werden. Unreine Funktionen können sich nur bei Kenntnis der Verwendung unvorhersehbar verhalten, weil sie Dinge tun oder von Dingen abhängig sind, die aus ihrer Verwendung nicht ersichtlich sind. Weitere Kenntnisse über den Zweck der Funktion und damit darüber, was sie von einem externen Zustand benötigt oder für einen externen Zustand tut, sind erforderlich, um ein System, das sie verwendet, in einen konsistenten Zustand zu versetzen und damit ein deterministisches Ergebnis zu erwarten.