Это интересная идея, но это неправильный способ по крайней мере по нескольким причинам. Вы бы потерять некоторые отношения вы ожидали бы провести:
(alter r identity) =/= r
(alter r f)(alter r f) =/= (alter r (comp f f))
(alter r f) =/= (ref-set r (f @r))
Кроме того, некоторые преобразователи Летучие боковые осуществления, и не имеют никакого бизнеса в dosync
блоке. т. е. если вы используете (take n)
в качестве преобразователя, то если ваш dosync
терпит неудачу, он будет повторять попытку, как если бы он вызывал (take (dec n))
, что нарушает требования к корпусу dosync
.
Проблема ref
позволяет читать и писать как отдельные шаги. Если вместо этого было что-то основополагающее, позволяющее вам «применять» вход в скрытое «состояние» и собирать вывод все за один шаг, последовательно с STM, то с этим было бы работать.