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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With