[Haskell-cafe] Re: Monad.Reader with updates

Jules Bean jules at jellybean.co.uk
Thu Nov 6 07:40:25 EST 2008


Mauricio wrote:
>>> Is there some abstraction in current ghc library
>>> that implements something like Reader, but where
>>> the value of the environment is updated at every
>>> "step"?
>>
>> do-it-yourself? you can start from reader definition and add what you
>> need. you just need to make "initial state" consisting from state
>> itself and update function so `run` will have just one initialization 
>> argument
>>
> 
> Sure. I've done a few versions, trying to change
> the way (>>=) is defined, and learned a lot with
> that. But I wanted to know if there's already the
> "right way to do it" instead of my "newbie way to
> do it" :)

It doesn't quite make sense, because one "step" isn't well defined.

How many "steps" is "return (f x)" ? how about "return x >>= \y -> 
return (f y)" ?

Because the monad laws guarantee those two things should be the same, 
and yet the first is zero steps and the second is one step, going by the 
crude "counting >>=s" method I'm guess you were thinking of.

So I think you'd have to make the steps explicit.

You could do this with a custom version of (>>) and (>>=) which 
automatically do a step, for example.

So

advance :: m () -- your primitive which changes the environment

a >>* b = a >> advance >> b
a >>*= f = do { r <- a; advance; f r }

Does that help?

Jules


More information about the Haskell-Cafe mailing list