Simple monads

Christian Maeder
Fri, 27 Jun 2003 12:55:48 +0200

>>not deeply
>>understanding the use of Haskell extensions in the State source, 
> I'm assuming Control.Monad.State's source in which case -no- extensions
> are used for -State- (well, at least I don't see any quickly glancing). 
> Extensions are used for the -MonadState class-.  

The portable parts of Control.Monad.State (that are sufficient for most 
cases) should be in an extra module (maybe called 
Control.Monad.StateTypes). In addition further non-overloaded names for 
put, get, gets and modify would be needed (maybe putState, getState, etc.)

There's no point to write your own "instance Monad ..." just because you 
want (or have) to be Haskell98 compliant.

The previous "newtype Labeller a = Labeller (Int -> (Int, a))" (the 
result tuple is reversed within Control.Monad.State) would simply become 

newtype Labeller a = State Int a

newLabel = do { n <- get; put (n + 1); return (Label n) }

runLabeller l = execState l minBound