Если Вы не можете изменить значение переменной в Haskell, как Вы создаете структуры данных?

Я использую коммерческое программное обеспечение, Automated Build Studio для целей сборки.

12
задан Don Stewart 18 April 2011 в 18:14
поделиться

3 ответа

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

В конце концов, вы выделяете новый корень для своего дерева, и что тогда? Как говорит Дарио, вы передаете его как параметр функции (вместо того, чтобы сохранять его в глобальной переменной).

Итак

  • Мутация поля в структуре, размещенной в куче, становится распределением новой структуры в куча.

  • Мутация глобальной переменной превращается в передачу параметра функции

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


PS Если вы действительно хотите, вы можете иметь изменяемые глобальные переменные в Haskell. В конце концов, это лучший в мире императивный язык программирования (по словам Вадлера или Пейтона Джонса, я забыл кого). Но если вы задаете этот вопрос, вы действительно не хотите. Еще.

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

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

2
ответ дан 2 December 2019 в 18:19
поделиться

Дарио дал хороший прямой ответ. Если вам нужна более подробная информация, есть Чисто функциональные структуры данных Криса Окасаки, целая книга по этой теме. Я купил его сам, но, к сожалению, у меня нет времени экспериментировать с идеями.

6
ответ дан 2 December 2019 в 18:19
поделиться

Идея, лежащая в основе чисто функциональных структур данных, состоит в том, чтобы вычислять новые значения вместо их изменения и передавать их (рекурсивно) в параметрах вместо того, чтобы сохранять их глобально.

Итак, учитывая функцию

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))

. Если вы хотите обновить значения в определенной позиции, вам понадобится больше расширенные структуры данных, такие как застежка-молния , которые, тем не менее, остаются чисто функциональными!

12
ответ дан 2 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: