Может кто-нибудь объяснить, как работает atomicModifyIORef? В частности:
(1) Дождаться блокировки или оптимистично попытаться повторить попытку, если есть конкуренция (например, TVar).
(2) Почему подпись atomicModifyIORef отличается от подписи modifyIORef? В частности, какова эта дополнительная переменная b?
Изменить: Я думаю, что я выяснил ответ на (2), в котором b - это значение, которое нужно извлечь (это может быть пустым, если не нужно). В однопоточной программе знание значения тривиально, но в многопоточной программе, возможно, захочется узнать, каково было предыдущее значение во время применяемой функции. Я предполагаю, что именно поэтому modifyIORef не имеет этого дополнительного возвращаемого значения (так как в этом случае использование modifyIORef с этим возвращаемым значением, вероятно, должно использовать atomicModifyIORef. Я все еще интересуюсь ответом на (1).