Сигнатура modifyIORef
достаточно прост:Какова цель дополнительного параметра результата atomicModifyIORef?
modifyIORef :: IORef a -> (a -> a) -> IO()
К сожалению, это не поточно. Существует альтернатива, которая касается этой проблемы:
atomicModifyIORef :: IORef a -> (a -> (a,b)) -> IO b
В чем конкретно отличия между этими двумя функциями? Как я должен использовать параметр b
при изменении IORef
, который может быть прочитан из другого потока?
Таким образом, если бы он был 'atomicModifyIORef :: IORef а -> (а -> а) -> IO a', возвращая старое значение, служили бы та же цель (и быть проще, ИМО). Интересно. – chi
Я не понимаю, зачем мне эту функцию для 'atomicModifyIORef', но не для' modifyIORef'? – leftaroundabout
@leftaroundabout Ну, 'modifyIORef' в любом случае не предоставляет никаких свойств атомарности, поэтому для этого это было бы не так полезно. – redneb