ST package:base-prelude
The strict
ST monad. The
ST monad allows for destructive
updates, but is escapable (unlike IO). A computation of type
ST s a returns a value of type
a, and execute
in "thread"
s. The
s parameter is either
- an uninstantiated type variable (inside invocations of
runST), or
- RealWorld (inside invocations of stToIO).
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) = _|_
A monad supporting atomic memory transactions.
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"
An abstract name for an object, that supports equality and hashing.
Stable names have the following property:
- If sn1 :: StableName and sn2 :: StableName and
sn1 == sn2 then sn1 and sn2 were created by
calls to makeStableName on the same object.
The reverse is not necessarily true: if two stable names are not
equal, then the objects they name may still be equal. Note in
particular that
makeStableName may return a different
StableName after an object is evaluated.
Stable Names are similar to Stable Pointers
(
Foreign.StablePtr), but differ in the following ways:
- There is no freeStableName operation, unlike
Foreign.StablePtrs. Stable names are reclaimed by the runtime
system when they are no longer needed.
- There is no deRefStableName operation. You can't get back
from a stable name to the original Haskell object. The reason for this
is that the existence of a stable name for an object does not
guarantee the existence of the object itself; it can still be garbage
collected.
A stable pointer is a reference to a Haskell expression that is
guaranteed not to be affected by garbage collection, i.e., it will
neither be deallocated nor will the value of the stable pointer itself
change during garbage collection (ordinary references may be relocated
during garbage collection). Consequently, stable pointers can be
passed to foreign code, which can treat it as an opaque reference to a
Haskell value.
A value of type StablePtr a is a stable pointer to a Haskell
expression of type a.
The current thread's stack exceeded its limit. Since an exception has
been raised, the thread's stack will certainly be below its limit
again, but the programmer should take remedial action immediately.
The member functions of this class facilitate writing values of
primitive types to raw memory (which may have been allocated with the
above mentioned routines) and reading values from blocks of raw
memory. The class, furthermore, includes support for computing the
storage requirements and alignment restrictions of storable types.
Memory addresses are represented as values of type
Ptr
a, for some
a which is an instance of class
Storable. The type argument to
Ptr helps provide some
valuable type safety in FFI code (you can't mix pointers of different
types without an explicit cast), while helping the Haskell type system
figure out which marshalling method is needed for a given pointer.
All marshalling between Haskell and a foreign language ultimately
boils down to translating Haskell data structures into the binary
representation of a corresponding data structure of the foreign
language and vice versa. To code this marshalling in Haskell, it is
necessary to manipulate primitive data types stored in unstructured
memory blocks. The class
Storable facilitates this manipulation
on all types for which it is instantiated, which are the standard
basic types of Haskell, the fixed size
Int types
(
Int8,
Int16,
Int32,
Int64), the fixed
size
Word types (
Word8,
Word16,
Word32,
Word64),
StablePtr, all types from
Foreign.C.Types, as well as
Ptr.
A
String is a list of characters. String constants in Haskell
are values of type
String.
See
Data.List for operations on lists.
Embed a strict state thread in an
IO action. The
RealWorld parameter indicates that the internal state used by
the
ST computation is a special one supplied by the
IO
monad, and thus distinct from those used by invocations of
runST.
Repeat a value
n times.
Given that this works on a
Semigroup it is allowed to fail if
you request 0 or fewer repetitions, and the default definition will do
so.
By making this a member of the class, idempotent semigroups and
monoids can upgrade this to execute in <math> by picking
stimes = stimesIdempotent or
stimes =
stimesIdempotentMonoid respectively.
>>> stimes 4 [1]
[1,1,1,1]
This is a valid definition of
stimes for an idempotent
Semigroup.
When
x <> x = x, this definition should be preferred,
because it works in <math> rather than <math>.
This is a valid definition of
stimes for an idempotent
Monoid.
When
mappend x x = x, this definition should be preferred,
because it works in <math> rather than <math>
This is a valid definition of
stimes for a
Monoid.
Unlike the default definition of
stimes, it is defined for 0
and so it should be preferred where possible.
The
stripPrefix function drops the given prefix
from a list. It returns
Nothing if the list did not start with
the prefix given, or
Just the list after the prefix, if it
does.
>>> stripPrefix "foo" "foobar"
Just "bar"
>>> stripPrefix "foo" "foo"
Just ""
>>> stripPrefix "foo" "barfoo"
Nothing
>>> stripPrefix "foo" "barfoobaz"
Nothing
The thread is waiting to retry an STM transaction, but there are no
other references to any TVars involved, so it can't ever
continue.
blocked in
retry in an STM transaction