[Haskell-cafe] "Read-only" functions in State Monad

Twan van Laarhoven twanvl at gmail.com
Sat Jun 30 19:53:31 EDT 2007

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


More information about the Haskell-Cafe mailing list