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"
:: a typeCtrl KGHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27
Modulebase-4.20.2.0Haskell2010
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"
Build a new STRef in the current state thread
Read the value of an STRef
Write a new value into an STRef
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.
Strict version of modifySTRef