Я использую библиотеку Haskell STM, и мне очень нравится возможность составлять транзакции и общий характер STM-типа "вы не можете получить-это-неправильный".
По уважительной причине, STM не разрешает действия IO внутри транзакции. Невозможно повторить действие ввода-вывода. (вставьте ссылку "Запустить ракеты" здесь). С другой стороны, транзакции с базами данных имеют некоторые гарантии атомарности, которые очень похожи. Есть ли принятый способ использовать их вместе?