I first started to grasp the power of monads when I looked at Haskell as an imperative language. Within do blocks, Haskell is effectively imperative. The neat thing is that, although you have control structures like for and while, these not built into the language, but rather imported like any other function.