Я вижу, что многие связанные с функциональным программированием темы упоминают разрушительные обновления. Я понимаю, что это нечто похожее на мутацию, поэтому я понимаю часть обновления. Но что такое разрушительная часть? Или я просто передумал?
Что такое деструктивное обновление?
Ответ 1
Вероятно, вы немного переусердствовали. В этом все, что есть; единственное, что "уничтожено", - это предыдущее значение того, что вы мутировали.
Предположим, что вы используете какое-то дерево поиска для хранения значений и хотите вставить новый. После нахождения местоположения, где идут новые значения, у вас есть два варианта:
-
С неизменяемым деревом вы создаете новые узлы вдоль пути от нового значения до корня. Поддеревья не вдоль пути повторно используются в новом дереве, и если у вас все еще есть ссылка на исходный корень дерева, вы можете использовать оба варианта, с общим общим поддеревьями, разделяемым между ними. Это экономит пространство без каких-либо дополнительных усилий, если у вас много разных копий, плавающих вокруг, и, конечно же, у вас есть все обычные преимущества неизменных структур данных.
-
С изменчивым деревом вы присоединяете новое значение, где оно принадлежит, и это; ничто другое не должно быть изменено. Это почти всегда быстрее и экономит на распределении памяти, если у вас только одна копия, но все, что ссылается на "старое" дерево, теперь имеет ссылку на новую. Оригинал был уничтожен; он ушел навсегда. Если вам нужно сохранить оригинал, вы должны пойти за счет создания совершенно новой копии всего, прежде чем изменять его.
Если "разрушение" кажется излишне суровым способом описания простого обновления на месте, вы, вероятно, не потратили столько времени, сколько у меня есть отладочный код, чтобы выяснить, где на Земле меняется какая-то ценность назад.