[Haskell-cafe] Really confused
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
>
> 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 at flippac.org
The task of the academic is not to scale great
intellectual mountains, but to flatten them.
More information about the Haskell-Cafe
mailing list