On 1/1/07, Yitzchak Gale <[EMAIL PROTECTED]> wrote:

stToState :: MonadState st m => (STRef s st -> ST s a) -> m a

That would make it very convenient, for example, to
use arrays inside a pure state monad.

The type signatures above do ensure (as far as I can see)
that the opacity of the ST state thread is not violated. But
unfortunately, the protective shield in runST created by the
higher-rank polymorphism is too thick.

Probably,
stToState :: MonadState st m => (forall s. STRef s st -> ST s a) -> m a

E.g.

stToState :: MonadState st m => (forall s. STRef s st -> ST s a) -> m a
stToState f = do
 s <- get
 let (x, s') = runST (do
       r <- newSTRef s
       x <- f r
       s' <- readSTRef r
       return (x, s'))
 put s'
 return x

--
Best regerds,
Tolik
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to