Ваша интуиция о копировании - это именно то направление, о котором вы должны думать. Тем не менее, «копирование» интеллектуально реализовано в среде выполнения Haskell. Например, учитывая
data Tree = Empty | Branch Tree Integer Tree
Вы можете реализовать функцию для замены левой ветви:
replaceLeft :: Tree -> Tree -> Tree
replaceLeft (Branch _ i r) newLeft = Branch newLeft i r
В результате вы не создаете полную копию нового дерева, так как в этом нет необходимости. Значение i
и деревья r
и newLeft
не изменены, поэтому нам не нужно копировать их содержимое в новую память.
Новый Branch
, который создается (это единственное реальное распределение в этом примере: создание структуры для хранения левого / правого дерева на Integer
) все еще ссылается на те же самые значения из старой ветви Копирование не требуется!
Поскольку структуры данных неизменны, в этом нет ничего плохого.