[project @ 2005-10-13 10:35:49 by ross]
authorross <unknown>
Thu, 13 Oct 2005 10:35:49 +0000 (10:35 +0000)
committerross <unknown>
Thu, 13 Oct 2005 10:35:49 +0000 (10:35 +0000)
comments re strict/lazy monads

Control/Monad/ST/Lazy.hs
GHC/ST.lhs

index a160cdf..5bf1265 100644 (file)
@@ -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)
 
index 4bb4256..909a8da 100644 (file)
@@ -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 #)