From: ross Date: Mon, 8 Sep 2003 16:23:58 +0000 (+0000) Subject: [project @ 2003-09-08 16:23:57 by ross] X-Git-Tag: nhc98-1-18-release~513 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=9f9c1ba962b98906e1a750b16138344bc62a6fd3;p=ghc-base.git [project @ 2003-09-08 16:23:57 by ross] ST doc adjustments --- diff --git a/Control/Monad/ST/Lazy.hs b/Control/Monad/ST/Lazy.hs index b91e062..a160cdf 100644 --- a/Control/Monad/ST/Lazy.hs +++ b/Control/Monad/ST/Lazy.hs @@ -51,10 +51,16 @@ import Hugs.LazyST #ifdef __GLASGOW_HASKELL__ -- | The lazy state-transformer monad. --- The first parameter is used solely to keep the states of different --- invocations of 'runST' separate from each other and from invocations --- of 'Control.Monad.ST.stToIO'. In the first case the type parameter --- is not instantiated; in the second it is 'RealWorld'. +-- A computation of type @'ST' s a@ transforms an internal state indexed +-- by @s@, and returns a value of type @a@. +-- The @s@ parameter is either +-- +-- * an unstantiated 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'. newtype ST s a = ST (State s -> (a, State s)) data State s = S# (State# s) @@ -82,14 +88,14 @@ instance Monad (ST s) where {-# NOINLINE runST #-} -- | Return the value computed by a state transformer computation. --- The @forall@ is a technical device to ensure that the state used --- by the 'ST' computation is inaccessible to the rest of the program. +-- The @forall@ ensures that the internal state used by the 'ST' +-- computation is inaccessible to the rest of the program. runST :: (forall s. ST s a) -> a runST st = case st of ST the_st -> let (r,_) = the_st (S# realWorld#) in r -- | Allow the result of a state transformer computation to be used (lazily) -- inside the computation. --- Note that if @f@ is strict, @'fixST' f@ will diverge. +-- Note that if @f@ is strict, @'fixST' f = _|_@. fixST :: (a -> ST s a) -> ST s a fixST m = ST (\ s -> let @@ -135,7 +141,8 @@ unsafeIOToST :: IO a -> ST s a unsafeIOToST = strictToLazyST . ST.unsafeIOToST -- | A monad transformer embedding lazy state transformers in the 'IO' --- monad. The 'RealWorld' parameter is a technical device to keep the --- state used by such computations separate from those inside 'runST'. +-- monad. 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'. stToIO :: ST RealWorld a -> IO a stToIO = ST.stToIO . lazyToStrictST diff --git a/GHC/Base.lhs b/GHC/Base.lhs index 1d786bb..988c94e 100644 --- a/GHC/Base.lhs +++ b/GHC/Base.lhs @@ -994,8 +994,8 @@ unpackNBytes# addr len# = unpack [] (len# -# 1#) #ifdef __HADDOCK__ \begin{code} --- | A placeholder argument for the 'Control.Monad.ST.ST' type constructor, --- to mark a state embedded in the 'Prelude.IO' monad by +-- | A special argument for the 'Control.Monad.ST.ST' type constructor, +-- indexing a state embedded in the 'Prelude.IO' monad by -- 'Control.Monad.ST.stToIO'. data RealWorld \end{code} diff --git a/GHC/IOBase.lhs b/GHC/IOBase.lhs index b37fb1e..d5a997c 100644 --- a/GHC/IOBase.lhs +++ b/GHC/IOBase.lhs @@ -113,8 +113,9 @@ returnIO x = IO (\ s -> (# s, x #)) -- Coercions between IO and ST -- | A monad transformer embedding strict state transformers in the 'IO' --- monad. The 'RealWorld' parameter is a technical device to keep the --- state used by such computations separate from those inside 'runST'. +-- monad. 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'. stToIO :: ST RealWorld a -> IO a stToIO (ST m) = IO m diff --git a/GHC/ST.lhs b/GHC/ST.lhs index 137debc..12ec5ca 100644 --- a/GHC/ST.lhs +++ b/GHC/ST.lhs @@ -34,10 +34,17 @@ too many people got bitten by space leaks when it was lazy. \begin{code} -- | The strict state-transformer monad. --- The first parameter is used solely to keep the states of different --- invocations of 'runST' separate from each other and from invocations --- of 'Control.Monad.ST.stToIO'. In the first case the type parameter --- is not instantiated; in the second it is 'RealWorld'. +-- A computation of type @'ST' s a@ transforms an internal state indexed +-- by @s@, and returns a value of type @a@. +-- The @s@ parameter is either +-- +-- * an unstantiated type variable (inside invocations of 'runST'), or +-- +-- * 'RealWorld' (inside invocations of 'Control.Monad.ST.stToIO'). +-- +-- It serves to keep the internal states of different invocations +-- of 'runST' separate from each other and from invocations of +-- 'Control.Monad.ST.stToIO'. newtype ST s a = ST (STRep s a) type STRep s a = State# s -> (# State# s, a #) @@ -77,7 +84,7 @@ unsafeInterleaveST (ST m) = ST ( \ s -> -- | Allow the result of a state transformer computation to be used (lazily) -- inside the computation. --- Note that if @f@ is strict, @'fixST' f@ will diverge. +-- Note that if @f@ is strict, @'fixST' f = _|_@. fixST :: (a -> ST s a) -> ST s a fixST k = ST $ \ s -> let ans = liftST (k r) s @@ -129,8 +136,8 @@ All calls to @f@ will share a {\em single} array! End SLPJ 95/04. -- module. Regrettably delicate. runST is behaving like a wrapper. -- | Return the value computed by a state transformer computation. --- The @forall@ is a technical device to ensure that the state used --- by the 'ST' computation is inaccessible to the rest of the program. +-- The @forall@ ensures that the internal state used by the 'ST' +-- computation is inaccessible to the rest of the program. runST :: (forall s. ST s a) -> a runST st = runSTRep (case st of { ST st_rep -> st_rep })