Идея, лежащая в основе чисто функциональных структур данных, состоит в том, чтобы вычислять новые значения вместо их изменения и передавать их (рекурсивно) в параметрах вместо их глобального хранения.
Итак, с учетом функции
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))
Если вы хотите обновить значения в определенной позиции, вам понадобятся более сложные структуры данных, такие как застежка-молния , которые, тем не менее, все еще чисто функциональны!