2016-05-11 12 views
4

Wenn ich in einem STM bin, dessen Transaktion fehlschlägt, und ich es als Teil des normalen Kontrollflusses versuche (keine STM-Kollision etc ..), möchte ich jemanden außerhalb einer Möglichkeit angeben, korrigierende Maßnahmen zu ergreifen .STM und ausgehende IO

Wenn es rein 'ausgehend' ist, kann mein STM immer noch rein wiedergegeben werden.

Wie kann ich durchführen ausgehend IO von einem STM-Versuch?

Hat jemand dies festgestellt? Wie böse ist das?

Antwort

3

Wenn Sie sicher sind, dass die durchgeführte IO die Invarianten von STM nicht beeinflusst, können Sie unsafeIOToSTM verwenden. Verwenden Sie es mit großer Sorgfalt, wie alle unsafe Zeug.

Ich frage mich jedoch, ob Sie das wirklich brauchen. Es ist unmöglich, von der Frage zu erzählen. Wenn Sie können, sollten Sie es vermeiden.

+0

Ich führe STM auf meinem Server durch, und ich möchte dem Benutzer etwas Text anzeigen (eine Nachricht an seine UI senden), um zu erfahren, warum die Transaktion fehlgeschlagen ist, so dass er die Formularübergabe behebt und in die schreibt TVar wieder. – nicolas

+5

@nicolas Verwenden Sie ['orElse'] (https://hackage.haskell.org/package/stm-2.4.4.1/docs/Control-Monad-STM.html#v:orElse) und geben Sie einen Erfolgs-/Fehlercode zurück. 'atomically $ (myPossiblyFailingSTMAction >> gibt True zurück)' orElse' (return False) ''. Wenn Sie "False" erhalten, wissen Sie, dass "myPossiblyFailingSTMAction" fehlgeschlagen ist. Viel sauberer als 'unsafeIOToSTM' –

+1

@nicolas In diesem Fall sollte man die Transaktion erfolgreich machen, aber ein" Misserfolg "Ergebnis zurückgeben, wie Benjamin Hodgson vorschlägt. – chi