add Data.Function
[haskell-directory.git] / GHC / ST.lhs
index cdccb18..909a8da 100644 (file)
@@ -39,13 +39,18 @@ too many people got bitten by space leaks when it was lazy.
 -- by @s@, and returns a value of type @a@.
 -- The @s@ parameter is either
 --
--- * an unstantiated type variable (inside invocations of 'runST'), or
+-- * an uninstantiated 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'.
+--
+-- 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 #)
 
@@ -145,7 +150,14 @@ runST st = runSTRep (case st of { ST st_rep -> st_rep })
 -- I'm only letting runSTRep be inlined right at the end, in particular *after* full laziness
 -- That's what the "INLINE [0]" says.
 --             SLPJ Apr 99
-{-# INLINE [0] runSTRep #-}
+-- {-# INLINE [0] runSTRep #-}
+
+-- SDM: further to the above, inline phase 0 is run *before*
+-- full-laziness at the moment, which means that the above comment is
+-- invalid.  Inlining runSTRep doesn't make a huge amount of
+-- difference, anyway.  Hence:
+
+{-# NOINLINE runSTRep #-}
 runSTRep :: (forall s. STRep s a) -> a
 runSTRep st_rep = case st_rep realWorld# of
                        (# _, r #) -> r