Оно не обязательно должно быть чистым, оно просто должно быть идемпотентом . На практике это одно и то же.
Кроме того, он должен быть только идемпотентным, если смотреть за пределы STM: если единственный побочный эффект, который вы производите, - это запись в какой-либо другой реф или (я думаю) отправка агенту, эта операция будет удерживаться до тех пор, пока ваша транзакция не завершится. удалось.
Это также не тот случай, когда имеет , чтобы быть любой из этих вещей: просто, если ваша функция обновления не чистая, результаты могут не соответствовать вашим ожиданиям.
Edit: dosync
документы говорят вам, что любые выражения в теле могут быть выполнены более одного раза. Вы не можете запустить alter
без запуска dosync
, поэтому, похоже, все необходимые вам документы есть. Что бы вы хотели изменить?