Ken Takusagawa wrote:
I'd like to have a state monad with the feature that I can somehow
annotate using the type system that some functions are only going to
read the state and not modify it. Such read-only functions are only
permitted to call other read-only functions, whereas state-modifying
functions can call both read-only and other state-modifying functions.
How can I do this? It does not seem to be straightforwardly doable
with Control.Monad.State.
How about something like
> readonly :: Reader a -> State a
> readonly = gets . runReader
Implicit conversion is probably not possible with Control.Monad.State,
you will have to make your own monad, maybe
> newtype State2 w s a = State2 (State s a)
> data Write
The phantom type w can be used to encode whether writing is needed
(State2 Write) or not (forall w. State2 w)
> get :: State2 w s s
> put :: s -> State2 Write s s
Twan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe