Я использую коммерческое программное обеспечение, Automated Build Studio для целей сборки.
Вы выделяете новый узел дерева, а старый остается. Для этого метода требуется действительно хороший распределитель, но он позволяет использовать все виды изящных устройств, потому что другие части программы все еще имеют доступ к старым узлам. Это находка для определенных видов умозрительных алгоритмов или других уловок, связанных с так называемыми «постоянными структурами данных».
В конце концов, вы выделяете новый корень для своего дерева, и что тогда? Как говорит Дарио, вы передаете его как параметр функции (вместо того, чтобы сохранять его в глобальной переменной).
Итак
Мутация поля в структуре, размещенной в куче, становится распределением новой структуры в куча.
Мутация глобальной переменной превращается в передачу параметра функции
Иногда также имеет смысл взять то, что было бы набором глобальных переменных в C, и поместить их все в объект, размещенный в куче.
PS Если вы действительно хотите, вы можете иметь изменяемые глобальные переменные в Haskell. В конце концов, это лучший в мире императивный язык программирования (по словам Вадлера или Пейтона Джонса, я забыл кого). Но если вы задаете этот вопрос, вы действительно не хотите. Еще.
лучший язык императивного программирования (по словам Вадлера или Пейтона Джонса, я забыл кого). Но если вы задаете этот вопрос, вы действительно не хотите. Еще. лучший язык императивного программирования (по словам Вадлера или Пейтона Джонса, я забыл кого). Но если вы задаете этот вопрос, вы действительно не хотите. Еще.Дарио дал хороший прямой ответ. Если вам нужна более подробная информация, есть Чисто функциональные структуры данных Криса Окасаки, целая книга по этой теме. Я купил его сам, но, к сожалению, у меня нет времени экспериментировать с идеями.
Идея, лежащая в основе чисто функциональных структур данных, состоит в том, чтобы вычислять новые значения вместо их изменения и передавать их (рекурсивно) в параметрах вместо того, чтобы сохранять их глобально.
Итак, учитывая функцию
insert :: Ord a => Node a -> a -> Node a
, ваша программа могла бы выглядеть так
-- Let the user enter k values that are stored in a tree structure
addTreeItems :: Int -> Node Int -> IO (Node Int)
addTreeItems 0 tree = return tree
addTreeItems k tree = do
putStr "Enter new item: "
item <- readLn
addTreeItems (k - 1) (insert tree item) -- Recursively pass the tree
main = do
tree <- addTreeItems 10 Empty
-- ...
Используя монадические вспомогательные функции, это можно упростить до таких вещей, как
(foldl insert Empty) `liftM` (sequence $ replicate k (putStr "Enter new item: " >> readLn))
. Если вы хотите обновить значения в определенной позиции, вам понадобится больше расширенные структуры данных, такие как застежка-молния , которые, тем не менее, остаются чисто функциональными!