Reputation: 687
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.
Upvotes: 5
Views: 587
Reputation: 53911
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
Upvotes: 9