2016-05-11 14 views
4

Если я нахожусь внутри STM, чья транзакция терпит неудачу, и я повторяю как часть нормального потока управления (без столкновения STM и т. Д.), Я могу указать кому-то вне пути принятия корректирующих действий ,STM и исходящий IO

Если это чисто «исходящий», то моя STM все еще может быть воспроизведена чисто.

Как я мог бы выполнить исходящей IO от STM повторить попытку?

С кем это столкнулось? Как это зло?

ответ

3

Если вы уверены, что выполненный IO не влияет на инварианты STM, вы можете использовать unsafeIOToSTM. Используйте его с большой осторожностью, как все вещи unsafe.

Я, однако, задаюсь вопросом, действительно ли это вам нужно. Об этом нельзя сказать. Если хотите, вы должны избегать этого.

+0

Я выполняю STM на своем сервере, и я хотел бы показать пользователю текст (отправить сообщение его пользовательскому интерфейсу) о том, почему транзакция не удалась, так что он фиксирует отправку формы и записывает ее на 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' (return False)' '. Если вы получаете «False», вы знаете, что «myPossiblyFailingSTMAction» не удалось. Гораздо чище, чем 'unsafeIOToSTM' –

+1

@nicolas В этом случае нужно сделать транзакцию успешной, но вернуть результат« неудачи », как предлагает Бенджамин Ходжсон. – chi