Что такое деструктивное обновление? - PullRequest
12 голосов
/ 06 августа 2011

Я вижу много тем, связанных с функциональным программированием, упоминающих деструктивные обновления. Я понимаю, что это что-то похожее на мутацию, поэтому я понимаю часть обновления. Но что является деструктивной частью? Или я просто слишком обдумал это?

Ответы [ 2 ]

17 голосов
/ 06 августа 2011

Вы, наверное, немного обдумали Изменчивость - это все, что нужно сделать; «уничтожается» единственное, что является предыдущим значением того, что вы мутировали.

Скажем, вы используете какое-то дерево поиска для хранения значений и хотите вставить новое. После нахождения местоположения, где появляются новые значения, у вас есть два варианта:

  • С неизменным деревом вы строите новые узлы вдоль пути от местоположения нового значения до корня. Поддеревья, не находящиеся вдоль пути, повторно используются в новом дереве, и если у вас все еще есть ссылка на корень исходного дерева, вы можете использовать оба, с общими поддеревьями, общими для них. Это экономит место без лишних усилий, если у вас много плавающих копий, несколько отличающихся друг от друга, и, конечно, у вас есть все обычные преимущества неизменяемых структур данных.

  • С изменяемым деревом вы присоединяете новое значение туда, где оно принадлежит, и это все; больше ничего не нужно менять. Это почти всегда быстрее и экономит на распределении памяти, если у вас есть только одна копия, но все, что имеет ссылку на «старое» дерево, теперь имеет ссылку на новое. Оригинал был уничтожен; это ушло навсегда. Если вам необходимо сохранить оригинал, вам придется потратить на создание совершенно новой копии всего этого , прежде чем изменить его.

Если «уничтожение» кажется излишне резким способом описания простого обновления на месте, то вы, вероятно, не потратили столько времени, сколько у меня есть код отладки, чтобы выяснить, где на Земле изменяется какое-то значение твоя спина.

0 голосов
/ 07 июня 2018

Императивные языки программирования позволяют переопределять переменные, например,

x = 1
x = 2

Таким образом, x сначала имеет значение 1, затем, позже, оно имеет значение 2. Вторая операция является деструктивным обновлением, поскольку x теряет свое первоначальное определение как равное 1.

Это не то, как определение обрабатывается в общей математике. После определения переменная сохраняет свое значение. Вышеизложенное, рассматриваемое как система уравнений, позволит вычесть первое из второго уравнения, что даст

x - x = 2 - 1 <=> 0 = 1

что является ложным утверждением. Предполагается, что после введения х то же самое.

Знакомое утверждение типа

x = x + 1

приведет к такому же выводу.

Функциональные языки одинаково используют переменные, после того как они определены, их невозможно переназначить. Вышеприведенное утверждение превратится в

x2 = x + 1

и у нас не будет цикла for или while, а будет рекурсия или какая-то функция более высокого порядка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...