If you can't change a variable's value in Haskell, how do you create data structures?

前端 未结 3 756
醉话见心
醉话见心 2021-02-02 17:58

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

3条回答
  •  天涯浪人
    2021-02-02 18:43

    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!

提交回复
热议问题