As per the title.
I have the following code which creates a binary search tree, but if I want it created and changed dynamically with user input, how would I do that if
The idea behind purely functional data structures is to compute new values instead of changing them and to pass them (recursively) in parameters instead of storing them globally.
So given a function
insert :: Ord a => Node a -> a -> Node a
your programm could look like this
-- 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
-- ...
Using monadic helper functions, this could be simplified to things like
(foldl insert Empty) `liftM` (sequence $ replicate k (putStr "Enter new item: " >> readLn))
If you want to update values at a certain position, you'll need more advanced datastructures like a zipper, that are nevertheless still purely functional!