Copyright | (c) The University of Glasgow 2001 |
---|---|
License | BSD-style (see the file libraries/base/LICENSE) |
Maintainer | [email protected] |
Stability | experimental |
Portability | non-portable (uses Control.Monad.ST) |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Mutable references in the (strict) ST monad.
a value of type STRef s a
is a mutable variable in state thread s
, containing a value of type a
>>> :{ runST (do ref <- newSTRef "hello" x <- readSTRef ref writeSTRef ref (x ++ "world") readSTRef ref ) :} "helloworld"
newSTRef :: a -> ST s (STRef s a) Source
Build a new STRef
in the current state thread
readSTRef :: STRef s a -> ST s a Source
Read the value of an STRef
writeSTRef :: STRef s a -> a -> ST s () Source
Write a new value into an STRef
modifySTRef :: STRef s a -> (a -> a) -> ST s () Source
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 seldomly 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 Control.Monad (replicateM_) >>> :{ print (runST (do ref <- newSTRef 0 replicateM_ 1000 $ modifySTRef ref (+1) readSTRef ref )) :} 1000
To avoid this problem, use modifySTRef'
instead.
modifySTRef' :: STRef s a -> (a -> a) -> ST s () Source
Strict version of modifySTRef
Since: base-4.6.0.0
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.8.3/docs/html/libraries/base-4.13.0.0/Data-STRef.html