It sounds like you are porting an algorithm which does destructive updates on this tree. If so, you can use the ST (or IO) monad and use STRef (IORef).

data Tree a
  = TreeRoot { stuff    :: STRef a
             , children :: STRef [Tree]
             }
     .....

you would get at the data like so:

doStuff node = do
    s <- readSTRef (sutff node)
    children <- readSTRef (children node)
    .....
    writeSTRef (children node) newChildren



This is probably the most direct translation from a destructive update setting.

As you said, having the upward pointers causes the entire tree to be recomputed when you make a change. If you want to move to a pure data structure with good sharing properties you will need to remove the upward pointers, at which point you have a pretty basic rose tree. (I suppose you could remove the downward pointers instead, but you'd have a very strange kind of tree; really, it would be a collection of lists with a common tail element).

You might consider:

http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data.Tree.html


Without knowing what you are doing with this tree its hard to be more specific.


Tom Hawkins wrote:

I'm porting an ML program to Haskell, but am having difficulty with particular data structure: a tree where each node has references to the children as well as the parent...

data Tree a
  = TreeRoot { stuff    :: a
             , children :: [Tree]
             }
  | TreeNode { stuff    :: a
             , parent   :: Tree
             , children :: [Tree]
             }

But because of these bidirectional links, every time I add a node I must reconstructing the entire tree. There is also the add coding complexity of threading the tree through various functions to simulate state.

What are my [monadic] options?

-Tom
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to