
= produces a series of nested functions in which all the arguments of earlier functions are available to later functions: x and y are available to "return" because
I'm getting a better grasp on monads, I think. My original problem, I think, was that I was still thinking imperatively. So when I saw this: class Monad m where (>>=) :: m a -> (a -> m b) -> m b I didn't understand the "big deal". I thought, okay so you "do" something with the function (a -> m b) and you "arrive" at m b. Now I realize that chaining a sequence of Monads via that function, a -> m b, means that a is available to any function further down the line, because it is an argument to a series of nested functions. So, doSomething = thing >>= \x -> thing2 >>= \y -> return (x,y) they are arguments of functions further up in the chain. This resembles imperative code in which any variable, once set, is available further down. Any clarifications welcome. -Mike