[Haskell-cafe] Destructive updates to plain ADTs

Johan Tibell johan.tibell at gmail.com
Sun Sep 9 10:58:22 CEST 2012

On Sun, Sep 9, 2012 at 1:46 AM, Milan Straka <fox at ucw.cz> wrote:
> Hi all,
> is there any way to perform a destructive update on a plain ADT?
> Imagine I have a simple
>   data Tree a = Nil | Node a (Tree a) (Tree a)
> I would like to be able to modify right subtree of an existing tree.
> I can do that for example when using IORefs by changing the datatype to
>   data Tree a = Nil | Node a (IORef (Tree a)) (IORef (Tree a))
> and use unsafePerformIO + writeIORef. But the IORefs cause additional
> complexity when working with the data type.
> At the moment I am interested in any GHC solution, be it non-portable or
> version specific. I would like just to run some benchmarks and see the
> results.
> Cheers,
> Milan

You can do it if you refer to the children using Array#s. That's what
I do in unordered-containers to implement a more efficient fromList.
For arbitrary field types I don't think there's a way (although it
would be useful when birthing persistent data structures).

-- Johan

More information about the Haskell-Cafe mailing list