From: ross Date: Thu, 13 Oct 2005 10:35:49 +0000 (+0000) Subject: [project @ 2005-10-13 10:35:49 by ross] X-Git-Tag: cmm-merge2~14 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=1364d50a755a360a9d567ff3ac229649af16ac47;p=ghc-base.git [project @ 2005-10-13 10:35:49 by ross] comments re strict/lazy monads --- diff --git a/Control/Monad/ST/Lazy.hs b/Control/Monad/ST/Lazy.hs index a160cdf..5bf1265 100644 --- a/Control/Monad/ST/Lazy.hs +++ b/Control/Monad/ST/Lazy.hs @@ -9,8 +9,8 @@ -- Portability : non-portable (requires universal quantification for runST) -- -- This module presents an identical interface to "Control.Monad.ST", --- but the underlying implementation of the state thread is /lazy/ (in --- the sense that (@_|_ >> a@ is not necessarily equal to @_|_@). +-- except that the monad delays evaluation of state operations until +-- a value depending on them is required. -- ----------------------------------------------------------------------------- @@ -61,6 +61,10 @@ import Hugs.LazyST -- -- 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 not strict in the state. For example, +-- +-- @'runST' (writeSTRef _|_ v >>= readSTRef _|_ >> return 2) = 2@ newtype ST s a = ST (State s -> (a, State s)) data State s = S# (State# s) diff --git a/GHC/ST.lhs b/GHC/ST.lhs index 4bb4256..909a8da 100644 --- a/GHC/ST.lhs +++ b/GHC/ST.lhs @@ -46,6 +46,11 @@ too many people got bitten by space leaks when it was lazy. -- It serves to keep the internal states of different invocations -- of 'runST' separate from each other and from invocations of -- 'Control.Monad.ST.stToIO'. +-- +-- The '>>=' and '>>' operations are strict in the state (though not in +-- values stored in the state). For example, +-- +-- @'runST' (writeSTRef _|_ v >>= f) = _|_@ newtype ST s a = ST (STRep s a) type STRep s a = State# s -> (# State# s, a #)