Philippa Cowderoy flippa at flippac.org
Wed Sep 21 14:21:37 EDT 2005

```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
>
> -- 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 at flippac.org