Mutate the contents of an
STRef.
>>> :{
runST (do
ref <- newSTRef ""
modifySTRef ref (const "world")
modifySTRef ref (++ "!")
modifySTRef ref ("Hello, " ++)
readSTRef ref )
:}
"Hello, world!"
Be warned that
modifySTRef does not apply the function
strictly. This means if the program calls
modifySTRef many
times, but seldom uses the value, thunks will pile up in memory
resulting in a space leak. This is a common mistake made when using an
STRef as a counter. For example, the following will leak memory
and may produce a stack overflow:
>>> import GHC.Internal.Control.Monad (replicateM_)
>>> :{
print (runST (do
ref <- newSTRef 0
replicateM_ 1000 $ modifySTRef ref (+1)
readSTRef ref ))
:}
1000
To avoid this problem, use
modifySTRef' instead.