#5073: Add blockST for nested ST scopes
---------------------------------+------------------------------------------
    Reporter:  simonpj           |        Owner:              
        Type:  bug               |       Status:  new         
    Priority:  normal            |    Milestone:              
   Component:  Compiler          |      Version:  7.0.3       
    Keywords:                    |     Testcase:              
   Blockedby:                    |   Difficulty:              
          Os:  Unknown/Multiple  |     Blocking:              
Architecture:  Unknown/Multiple  |      Failure:  None/Unknown
---------------------------------+------------------------------------------
 GHC lacks the `blockST` and `importVar` primitives introduced by
 Launchbury/Sabry:
  * http://www.cs.indiana.edu/~sabry/papers/monadic-state-ax.pdf (section
 10).
  * See also Fluet & Morrisset http://www.cs.rit.edu/~mtf/research/rgn-
 monad/JFP06/jfp06.pdf (page 7ff)

 The two new combinators have these types:
 {{{
 blockST :: (forall r. ST (s,r) a) -> ST s a
 importVar :: STRef s a -> STRef (s,r) a
 }}}
 They are useful, and have no runtime cost; I don't think it'd be hard to
 provide them.  We need these primitives, I think:
 {{{
 promoteState# :: State# s -> State# (s,r) a
 demoteState#  :: State# (s,r) -> State# s
 promoteVar# :: MutVar# s a -> MutVar# (s,r) a
 }}}
 All three are implemented as no-ops.

 Now the implementations look (something) like this:
 {{{
 blockST (ST thing) = ST (\s -> case thing (promoteState# s) of
                                  (s', r) -> (demoteState# s', r) )
 promoteVar (STRef r) = STRef (promoteVar# r)
 }}}
 Things to think about:
  * Can we use coercions instead of primops?   (I think yes for
 `promote/demoteState` but it's unsound to demote variables.)
  * I'm hazy about what type safety guarantees we still have in Core, where
 the representation of the state monad is exposed.
  * Nomenclature. I'm not attached to these particular names.
  * Is there other relevant background material?

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/5073>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler

_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to