
On Wed, 21 Sep 2005, Mark Carter wrote:
I get the idea that data SM a = SM (S -> (a,S)) maps a state to a result, and a new state. OTOH, looking at
instance Monad SM where -- defines state propagation SM c1 >>= fc2 = SM (\s0 -> let (r,s1) = c1 s0 SM c2 = fc2 r in c2 s1) return k = SM (\s -> (k,s))
just confuses me no end.
It really broke my brain for a while too - I had to graph the thing out on a piece of paper before I could follow what it was doing. The return should be easy enough, no? In the >>= code, c is "unboxed computation", fc is "function yielding computation", r is "result" and s is "state" - the first line of the let gets the result of the first computation and the state after it, the second line applies fc2 to the result to get the second computation and then the final line applies the computation to the intermediate state. There's a little boxing and unboxing going on, but that's pretty much it.
Any pointers, like am I taking completely the wrong approach anyway? I'm also puzzled as to how the initial state would be set.
You set the initial state with a "run" function, like so: runSM (SM f) initialState = f initialState The result will be a tuple: (result, finalState) -- flippa@flippac.org The task of the academic is not to scale great intellectual mountains, but to flatten them.