Strict version of modifySTRef
Modulebase-compat-0.14.1Haskell2010
Data.STRef.Compat
- 1 type
- 6 values
- Packagebase-compat-0.14.1
- Exports7
- LanguageHaskell2010
- LicenceMIT
- SourceSTRef.hs
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"
Instances4NFData2, NFData1, Eq, NFData
NFData2 STRefDefined in deepseq-1.5.0.0 · Control.DeepSeqNFData1 (STRef s)Defined in deepseq-1.5.0.0 · Control.DeepSeqEq (STRef s a)Defined in ghc-internal-9.1003.0 · GHC.Internal.STRefPointer equality.
NFData (STRef s a)Defined in deepseq-1.5.0.0 · Control.DeepSeqNOTE: Only strict in the reference and not the referenced value.
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.
Build a new STRef in the current state thread
Read the value of an STRef
Write a new value into an STRef
Strict version of modifySTRef