Complex data structures in Haskell - how do they work?

前端 未结 2 1022
礼貌的吻别
礼貌的吻别 2021-02-01 07:29

As I figured out, variables in Haskell are immutable (thus, they are not really `variables\').

In this case, if we have a complex and big data structure, like a red-bla

相关标签:
2条回答
  • 2021-02-01 07:51

    Yes, the solution is to return a new data structure which represents the modified value, however there is no requirement to copy the entire structure for your example (red-black trees) since you can just copy the nodes on the path from the root to the inserted node. This allows the insert operation to be the same complexity as the imperative version.

    Chris Okasaki's Purely functional data structures contains a number of implementations of immutable data structures - this book is a modified version of his phD thesis which you can find here

    0 讨论(0)
  • 2021-02-01 07:56

    Your intuition about copying is exactly the right direction you should be thinking. However, the 'copying' intelligently implemented by the Haskell runtime. For example, given

    data Tree = Empty | Branch Tree Integer Tree
    

    You could implement a function to replace the left branch:

    replaceLeft :: Tree -> Tree -> Tree
    replaceLeft (Branch _ i r) newLeft = Branch newLeft i r
    

    The result isn't that you create a entire copy of the new tree, as that isn't necessary. The value i and the trees r and newLeft are unchanged so we don't have to copy their contents into fresh memory.

    The new Branch that is created (this is the only real allocation in this example: the creation of the structure to hold the left/right trees on the Integer) still references the exact same values from the old branch, no copying needed!

    Since the data structures are immutable, there's no harm in doing this.

    0 讨论(0)
提交回复
热议问题