Haskell: TVar: orElse

Является ли "else" частью orElse, когда транзакция повторяется из-за другой транзакции, записывающей в TVar, которую она прочитала, или только когда retry явно называется?

Ответ 1

Если у вас

orElse a b

то b запускается, только если retry явно указано в a. В противном случае orElse по существу станет недетерминированным. (Повторение транзакций, выполняемых STM, является прозрачным и не должно влиять на результат любых вычислений.)