Haskell IORef array usage

597 views Asked by At

I am working on an program that uses a large list of IORef's to a data type. Which is the more memory/processor-efficient way to do this:

[IORef Foo]

or

IORef [Foo]

Ignore the fact that I am using lists instead of vectors or arrays.

1

There are 1 answers

0
daniel gratzer On BEST ANSWER

With [IORef Foo] you can update elements easily, with IORef [Foo], you can only update the whole list. Since you're likely wanting to efficiently update elements without copying, you want [IORef Foo]. Think, you want a list of mutable things, not a mutable list of immutable things.

As an example

import Data.IORef

makeTest :: IO [IORef Int]
makeTest = sequence [newIORef 0, newIORef 1, newIORef 2]

main = do
  test <- makeTest
  readIORef (test !! 1) >>= print
  modifyIORef (test !! 1) (+1) -- Doesn't copy list
  readIORef (test !! 1) >>= print