Здравствуйте, Cyberax, Вы писали:
>> Если будет время, опиши, пожалуйста, задачу, а не реализацию. Хорошо бы >> в таком виде, чтобы решение можно было набросать за пару часов. Самому >> интересно, решается ли она с помощью хаскелловской реализации STM. C>Задача простая: C>1) Дан обычный линейный однонаправленый список. C>2) Необходимо придумать механизм транзакций, чтобы можно было поменять C>элемент из середины списка, не влияя на клиентов вне транзакции. C>3) Этот механизм не должен приводить к копированию списка.
По моему скромному имху, "дан линейный однонаправленный список ..." — это не задача. Задача — это, например, перевести деньги со счета на счет.
Теперь по сути вопроса. Если дан список неизменяемых значений (целых чисел, например) — то задача некорректно поставлена, т.к. и без транзакций нельзя поменять элемент в середине списка, не скопировав элементы, ему предшествующие. Т.е., если в терминах хаскелловской реализации мы работаем с переменной типа TVar [Int] (по сути, это одна транзакционная ячейка, содержащая весь список), каждая транзакция будет вызывать копирование всего списка; правда, смысла в таких транзакциях немного. А вот если мы работаем со списком ячеек транзакционной памяти — [TVar Int] — изменение одной из ячеек в списке копирования других элементов не вызовет. Механизм придумывать не надо — он уже придуман и реализован, я уже приводил здесь ссылку на статью.