| Copyright | (c) The University of Glasgow 2001 |
|---|---|
| License | BSD-style (see the file libraries/base/LICENSE) |
| Maintainer | libraries@haskell.org |
| Stability | experimental |
| Portability | non-portable (uses Control.Monad.ST) |
| Safe Haskell | Trustworthy |
| Language | Haskell2010 |
Data.STRef
Contents
Description
Mutable references in the (strict) ST monad.
a value of typeSTRef s a is a mutable variable in state threads, containing a value of typea
>>>:{runST (do ref <- newSTRef "hello" x <- readSTRef ref writeSTRef ref (x ++ "world") readSTRef ref ):}"helloworld"
modifySTRef ::STRef s a -> (a -> a) ->ST s ()Source#
Mutate the contents of anSTRef.
>>>:{runST (do ref <- newSTRef "" modifySTRef ref (const "world") modifySTRef ref (++ "!") modifySTRef ref ("Hello, " ++) readSTRef ref ):}"Hello, world!"
Be warned thatmodifySTRef does not apply the function strictly. This means if the program callsmodifySTRef 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, usemodifySTRef' instead.
modifySTRef' ::STRef s a -> (a -> a) ->ST s ()Source#
Strict version ofmodifySTRef
Since: 4.6.0.0
Produced byHaddock version 2.20.0