[Haskell-cafe] State monad in the wikibood article

Matthew Brecknell haskell at brecknell.org
Thu Mar 1 01:15:11 EST 2007

TJ <tjay.dreaming at gmail.com> said:
> In the wikibook article here:
> http://en.wikibooks.org/wiki/Haskell/Understanding_monads, which
> really does an excellent job explaining things (nuclear waste
> woohoo!), I am stuck at the following code snippet:
> container >>= fn =
>  \st -> let (a, st2)   = container st
>             container2 = fn a
>         in  container2 st2
> What stumps me is that (>>=) is supposed to return a container, but if
> we return (container2 st2) as in the code, then what we're really
> returning is the contents of the container!

Note the lambda abstraction (\st -> ...) at the beginning of the
definition. This means that (container >>= fn) returns a *function* that
maps an input state to the result of (container2 st2). It doesn't return
the result of (container st2) directly.

> So what would happen if we do this:
> nuclearWasteInContainer >>= processTheWaste >>= thoroughProcessTheWaste
> It seems to me that the second (>>=) in the above expression would
> have the arguments (nuclearWaste) and (nuclearWasteProcessor), when
> what it really expects are (Container nuclearWaste) and
> (nuclearWasteProcessor). So isn't something wrong with the definition
> of (>>=) above? Or am I missing something?
> (I know the article says that the type for their supposed State monad
> at that point is not actually correct, and will be clarified further
> on, but that seems to be irrelevant to my question.)
> TJ the forever noobie.

More information about the Haskell-Cafe mailing list