Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Haskell IORef array usage

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.

like image 861
functorial Avatar asked Jan 15 '14 05:01

functorial


1 Answers

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
like image 59
Daniel Gratzer Avatar answered Sep 21 '22 16:09

Daniel Gratzer