This is the deal: Haskell monads are often misunderstood to the detriment of Haskell projects across the 'net.

The reality is that they are extremely easy to understand when you describe them in plain language: They are wrapped functions that take a context and return some value plus a new context.

Here's a definition for a 'State' monad that implements mutable state:

newtype State s a = State { runState :: s -> (a, s) }

Or more simply:

newtype State s a = State (s -> (a, s))

Let's take a look at a basic computation using the State monad: