Yitzchak Gale wrote: > It seems to me that a natural notion of a state transformer > in the ST monad is the type: > > STRef s st -> ST s a
Are there any useful functions of this type? I guess, your intention is
that this "transformer" makes no other use of the ST monad than reading
or writing a single variable. It seems, every such function better had
a purely functional interface anyway, even if it makes use of runST
internally.
> stToState :: MonadState st m => (STRef s st -> ST s a) -> m a
>
> The type signatures above do ensure (as far as I can see)
> that the opacity of the ST state thread is not violated.
I doubt that. The "transformer" you pass in could have captured
references from a different state thread, which is exactly the problem
the rank-2 type should prevent. I guess, the type signature you want is
stToState :: MonadState st m => (forall s . STRef s st -> ST s a) -> m a
which should actually work with runST and which would also be a bit
pointless (see above). At least if I got rank-2 types correctly, which
isn't guaranteed.
> Any ideas? A better approach?
Uhm... use MonadState in the first place? The converse is comparatively
easily accomplished:
stateToST :: STRef s st -> State st a -> ST s a
stateToST ref action = do (a, st') <- readSTRef ref >>= runState action
writeSTRef ref st'
return a
-Udo
--
"Human legalese is the schema language of our society."
-- Tim Berners-Lee in http://w3.org/DesignIssues/Evolution
signature.asc
Description: Digital signature
_______________________________________________ Haskell-Cafe mailing list [email protected] http://www.haskell.org/mailman/listinfo/haskell-cafe
