Was genau macht das Lesen aus dem Prozessspeicher zu einem reinen Vorgang? Angenommen, ich habe ein Array mit 100 Ganzzahlen im globalen Speicher erstellt und dann das 42. Element dieses Arrays verwendet. Es ist keine Nebenwirkung, oder? Warum ist das Lesen des gleichen Arrays von 100 Ganzzahlen aus einer Datei ein Nebeneffekt?
functional-programming
side-effect
ZhekaKozlov
quelle
quelle
Antworten:
Wenn sich der Speicher, auf den Sie zugreifen, ändern kann, handelt es sich in der Tat um einen Nebeneffekt.
In Haskell hat die Funktion zum Zugreifen auf ein veränderliches Array (
IOArray
) beispielsweise den Typ(für unsere Zwecke leicht vereinfacht). Während des Zugriffs auf ein unveränderliches Array hat Typ
Die erste Version gibt etwas vom Typ zurück,
IO e
was bedeutet, dass sie I / O-Nebenwirkungen hat. Die zweite Version gibt einfach ein Element vom Type
ohne Nebenwirkungen zurück.Wenn Sie auf eine Datei zugreifen, können Sie beim Kompilieren einfach nicht wissen, ob sich die Datei während eines Programmlaufs jemals ändern wird. Daher müssen Sie es immer als eine Operation mit möglichen Nebenwirkungen behandeln.
quelle
In der Informatik hat eine Funktion oder ein Ausdruck eine Nebenwirkung, wenn sie nicht nur einen Wert zurückgibt, sondern auch einen bestimmten Zustand ändert oder eine beobachtbare Wechselwirkung mit aufrufenden Funktionen oder der Außenwelt aufweist. Das Lesen aus einer Datei ist eine beobachtbare Interaktion mit der Außenwelt. Es erfüllt die Definition der Nebenwirkung. Das Lesen des 42. Elements aus dem globalen Speicher ist ebenfalls ein Nebeneffekt, es sei denn, Ihr Array ist eine Konstante, da dies eine beobachtbare Interaktion mit anderen Funktionen ist, die das Array möglicherweise ändern.
quelle
Wenn Sie über ein freigegebenes Dateihandle verfügen, wird beim Lesen einer Datei dieses Dateihandle an die Position verschoben, an der Sie es gelesen haben, und an dieser Position belassen.
Wenn Sie zwei Threads mit separaten Dateizugriffspunkten für dieselbe Datei haben, hat das Lesen von einem Thread keine nennenswerten Nebenwirkungen auf den anderen.
In beiden Fällen, beim Lesen des Speichers und beim Lesen von Dateien, kann es jedoch zu versteckten Nebeneffekten beim Zwischenspeichern des Betriebssystems kommen.
quelle
Das Auslesen aus dem Speicher hat keinen Einfluss auf andere Funktionen und ist daher nebenwirkungsfrei. Beim Lesen aus einer Datei wird in der Regel der Positionszeiger der Datei verschoben. Wenn Sie also erneut lesen, lesen Sie die Daten nach dem, was Sie bereits gelesen haben. Dadurch ändert eine Lesefunktion das Ergebnis anderer Lesefunktionen. Dies ist ein Nebeneffekt. Wenn Sie stattdessen eine Datei auf einmal öffnen, lesen und schließen, verschwindet dieser Nebeneffekt. Dies ist jedoch für große Dateien nicht möglich. Abhängig davon, wie Sie die Datei öffnen, kann sie nach dem Öffnen gesperrt werden. Der erste Versuch, die Datei zu öffnen und zu lesen, schlägt fehl, während die folgenden Versuche mit dem Fehler " Datei bereits geöffnet" fehl , was wiederum ein Nebeneffekt ist.
Das Erstellen einer nebenwirkungsfreien Lesefunktion, die die Datei auf einmal liest und mehrere Lesevorgänge gleichzeitig zulässt, ist schwierig, da es Dateischreibfunktionen gibt, die von der Lesefunktion beeinflusst werden, und das Entfernen der Dateischreibfunktionen ist wiederum nicht möglich .
quelle
IO
Monade?), Könnten Sie eine nebenwirkungsfreie Funktion zum Lesen erstellen .Das Lesen aus einem Stream ist bereits ein Nebeneffekt, da das Ergebnis von Funktionen wie beispielsweise
isEOF
nach dem Lesen ein anderes Ergebnis zurückgeben kann als vor dem Lesen.quelle