Copyright | (c) The University of Glasgow 1992-2002 |
---|---|
License | see libraries/base/LICENSE |
Maintainer | ghc-devs@haskell.org |
Stability | internal |
Portability | non-portable (GHC Extensions) |
Safe Haskell | Unsafe |
Language | Haskell2010 |
The ST
Monad.
Documentation
The strict ST
monad.
The ST
monad allows for destructive updates, but is escapable (unlike IO).
A computation of type
returns a value of type ST
s aa
, and
execute in "thread" s
. The s
parameter is either
- an uninstantiated type variable (inside invocations of
runST
), or RealWorld
(inside invocations ofstToIO
).
It serves to keep the internal states of different invocations
of runST
separate from each other and from invocations of
stToIO
.
The >>=
and >>
operations are strict in the state (though not in
values stored in the state). For example,
runST
(writeSTRef _|_ v >>= f) = _|_
Instances
Applicative (ST s) Source # | @since base-4.4.0.0 |
Functor (ST s) Source # | @since base-2.01 |
Monad (ST s) Source # | @since base-2.01 |
MonadFix (ST s) Source # | @since base-2.01 |
Monoid a => Monoid (ST s a) Source # | @since base-4.11.0.0 |
Semigroup a => Semigroup (ST s a) Source # | @since base-4.11.0.0 |
Show (ST s a) Source # | @since base-2.01 |
runST :: (forall s. ST s a) -> a Source #
Return the value computed by a state thread.
The forall
ensures that the internal state used by the ST
computation is inaccessible to the rest of the program.
Unsafe functions
unsafeInterleaveST :: ST s a -> ST s a Source #
unsafeInterleaveST
allows an ST
computation to be deferred
lazily. When passed a value of type ST a
, the ST
computation will
only be performed when the value of the a
is demanded.
unsafeDupableInterleaveST :: ST s a -> ST s a Source #
unsafeDupableInterleaveST
allows an ST
computation to be deferred
lazily. When passed a value of type ST a
, the ST
computation will
only be performed when the value of the a
is demanded.
The computation may be performed multiple times by different threads,
possibly at the same time. To prevent this, use unsafeInterleaveST
instead.
@since base-4.11