Was ist der Zweck des zusätzlichen Ergebnisparameters von atomicModifyIREef?

8

Die Signatur von modifyIORef ist einfach genug:

%Vor%

Leider ist das nicht Thread-sicher. Es gibt eine Alternative, die dieses Problem behebt:

%Vor%

Was genau sind die Unterschiede zwischen diesen beiden Funktionen? Wie soll ich den Parameter b verwenden, wenn ich eine IORef ändere, die von einem anderen Thread gelesen werden kann?

    
leftaroundabout 22.09.2016, 13:25
quelle

4 Antworten

1

Wie Sie in einem Kommentar gesagt haben, ohne Nebenläufigkeit könnten Sie einfach etwas schreiben wie

%Vor%

Aber in einem gleichzeitigen Kontext könnte jemand anders den Bezug zwischen dem Lesen und dem Schreiben ändern.

    
dfeuer 25.09.2016, 00:03
quelle
11

Der zusätzliche Parameter wird verwendet, um einen Rückgabewert bereitzustellen. Beispielsweise möchten Sie möglicherweise den in IORef gespeicherten Wert atomar ersetzen und den alten Wert zurückgeben. Sie können das so machen:

%Vor%

Wenn Sie keinen zurückzugebenden Wert haben, können Sie Folgendes verwenden:

%Vor%

, das die gleiche Signatur wie modifyIORef hat.

    
redneb 22.09.2016 13:36
quelle
2

So verstehe ich das. Denken Sie an Funktionen, die dem Klammer-Idiom folgen, z. B.

%Vor%

Diese Funktion nimmt eine Funktion als Argument und gibt den Rückgabewert dieser Funktion zurück. atomicModifyIORef ist dem ähnlich. Es nimmt eine Funktion als Argument, und die Absicht ist, den Rückgabewert dieser Funktion zurückzugeben. Es gibt nur eine Komplikation: Die Argumentfunktion muss auch einen neuen Wert zurückgeben, der in IORef gespeichert wird. Aus diesem Grund benötigt atomicModifyIORef von dieser Funktion zwei Werte zurück. Natürlich ist dieser Fall mit dem Bracket-Fall nicht vollständig vergleichbar (z. B. gibt es keine IO , wir befassen uns nicht mit der Ausnahmesicherheit usw.), aber diese Analogie gibt Ihnen eine Idee.

    
safsaf32 24.09.2016 20:54
quelle
1

Die Art, wie ich das sehen möchte, ist über die State Monad. Eine Stateful-Operation ändert einen internen Zustand und liefert zusätzlich eine Ausgabe. Hier befindet sich der Status in IORef und das Ergebnis wird als Teil der Operation IO zurückgegeben. Also können wir die Funktion mit State wie folgt umformulieren:

%Vor%     
Petr Pudlák 20.01.2018 13:11
quelle