Подтвердить что ты не робот

Функциональное программирование: неизменная эффективность структуры данных

Я не понимаю, как компиляторы FP быстро делают код, связанный с неизменяемыми структурами данных, а не взрывают стек и т.д.

Например, вставьте операцию в дерево, она должна скопировать все дерево перед добавлением нового node и вернуть скопированное дерево по сравнению с императивным couterpart, которому нужно только добавить указатель на новый node. Если операция вставки выполняется в миллионы раз, это потребует загрузки памяти, и копирование будет медленнее и медленнее, когда дерево будет больше. Как оптимизаторы FP оптимизируют это?

4b9b3361

Ответ 1

Вам не нужно копировать все дерево, чтобы внести изменения; вы можете поделиться большей частью структуры. См. диаграммы в этот блог, или этот разговор от Rich Hickey на Clojure (см. обсуждение хеш-попыток примерно на полпути).

Ответ 2

Компилятор действительно не оптимизирует это, это то, что вам нужно программировать специально при кодировании. Методы для этого объясняются в превосходных чисто функциональных структурах данных (book, тезис).

Ответ 4

Если сборщик мусора выполняет свою работу, старые копии структуры данных будут восстановлены, когда они больше не будут использоваться.