OCaml: Führt das Speichern von Werten, die später verwendet werden, zu "Nebenwirkungen"?

8

Für eine Hausaufgabe wurden wir angewiesen, eine Aufgabe zu erledigen, ohne irgendwelche "Nebenwirkungen" einzuführen. Ich habe "Nebenwirkungen" auf Wikipedia nachgeschlagen, und obwohl ich das in der Theorie verstehe, bedeutet es "verändert einen Zustand oder hat eine beobachtbare Interaktion mit aufrufenden Funktionen", ich habe Probleme, Einzelheiten herauszufinden.

Würde beispielsweise das Erstellen eines Wertes, der ein Nicht-Kompilierzeit-Ergebnis enthält, zu Nebeneffekten führen?

Sprich ich hatte (vielleicht nicht syntaktisch perfekt):

%Vor%

Würde dies zu Nebenwirkungen führen? Ich denke, vielleicht bin ich verwirrt darüber, was "einen Zustand verändert" in der Definition von Nebenwirkungen bedeutet.

    
Casey Patton 28.09.2011, 05:34
quelle

2 Antworten

8

Nein; ein Nebeneffekt bezieht sich z.B. mutieren einer ref -Zelle mit dem Zuweisungsoperator := oder anderen Dingen, bei denen sich der Wert, auf den sich ein Name bezieht, im Laufe der Zeit ändert. In diesem Fall ist myList ein unveränderbarer Wert, der sich während des Programms niemals ändert, daher ist es wirkungsfrei.

Siehe auch

Ссылка

    
Brian 28.09.2011, 05:40
quelle
5

Eine gute Möglichkeit, darüber nachzudenken ist: "Habe ich etwas verändert, was späterer Code (einschließlich das Ausführen derselben Funktion später) jemals anders sehen könnte als den Wert, den ich zurückgebe?" Wenn ja, ist das ein Nebeneffekt. Wenn nicht, dann kannst du wissen, dass es keinen gibt.

Also, etwas wie:

%Vor%

hat keine Nebenwirkungen, weil es nur einen neuen Wert zurückgibt, der um eins größer als eine Ganzzahl v ist. Wenn Sie also den folgenden Code in der oberen Ebene ausführen, erhalten Sie die entsprechenden Ergebnisse:

%Vor%

Wie Sie sehen können, hat sich der Wert von x nicht geändert. Da wir den Rückgabewert nicht gespeichert haben, wurde nichts wirklich erhöht. Unsere Funktion selbst modifiziert nur den Rückgabewert, nicht das X selbst. Um es in x zu speichern, müssten wir also:

%Vor%

Da die Funktion inc_nosf keine Nebenwirkungen hat (dh sie kommuniziert nur mit der Außenwelt über ihren Rückgabewert, nicht durch andere Änderungen).

Aber so etwas wie:

%Vor%

hat Nebenwirkungen, weil es den in der durch r dargestellten Verweis gespeicherten Wert ändert. Wenn Sie also ähnlichen Code in der obersten Ebene ausführen, erhalten Sie stattdessen Folgendes:

%Vor%

In diesem Fall, obwohl wir den Rückgabewert immer noch nicht speichern, wurde er trotzdem inkrementiert. Das bedeutet, dass Änderungen an etwas anderem als dem Rückgabewert vorgenommen werden müssen. In diesem Fall war diese Änderung die Zuweisung mit := , die den gespeicherten Wert des ref.

änderte

Wenn Sie in Ocaml die Verwendung von Referenzen, Datensätzen, Klassen, Strings, Arrays und Hash-Tabellen vermeiden, vermeiden Sie das Risiko von Nebenwirkungen. Sie können zwar Zeichenfolgenliterale verwenden, ohne die Zeichenfolge an Ort und Stelle zu ändern, indem Sie Funktionen wie String.set oder String.fill verwenden. Grundsätzlich verursacht jede Funktion, die einen vorhandenen Datentyp ändern kann, einen Nebeneffekt.

    
Keith Irwin 28.09.2011 06:03
quelle