2016-05-11 4 views
4

トランザクションが失敗したSTMの内部にいて、通常の制御フロー(STM衝突などなし)の一部として再試行した場合、是正措置を講じる方法以外の人に指示することができます。STMと発信IO

純粋に「発信」の場合、私のSTMは引き続き純粋に再生できます。

どうすればよいですか発信 IOがSTMから再試行されましたか?

誰かがこれに遭遇しましたか?これはどれほど悪いのでしょうか?

答えて

3

実行されたIOがSTMのインバリアントに影響しないことが確かであれば、 unsafeIOToSTMを使用できます。すべてのunsafeのように、細心の注意を払って使用してください。

本当に必要かどうか疑問に思っています。この質問からは分かりません。できれば、それを避けるべきです。

+0

私は自分のサーバーでSTMを実行していますが、なぜトランザクションが失敗したかについてのテキストを(ユーザーのUIにメッセージを投稿して)表示したいので、フォームの提出を修正して、再びTVar。 – nicolas

+5

@nicolas ['orElse'](https://hackage.haskell.org/package/stm-2.4.4.1/docs/Control-Monad-STM.html#v:orElse)を使用して、成功/失敗のコードを返します。 'atomically $(myPossiblyFailingSTMAction >> Return True)' orElse'(Falseを返します) ''。 'False'を取得した場合、' myPossiblyFailingSTMAction'は失敗しました。 'unsafeIOToSTM'よりもきれいです –

+1

@nicolas Benjamin Hodgsonが示唆するように、この場合、トランザクションは成功するはずですが、失敗の結果が返されます。 – chi