do-notation, >>=, applicative operators (now that all Monads are Applicative). You don't have to use the Kleisli composition if it doesn't make sense for what you're trying to do. f >=> return = freturn >=> f = ff >=> (g >=> h) = (f >=> g) >=> hreturn as the identity under (>=>)) and associativity properties that we've come to expect from a well-behaved algebraic structure like a Monoid. a -> m b as a {-> m} b rather than the technically correct but opaque a -> {m b}. From this viewpoint, we come to see the relationship between this Monad (which is itself quite simple; it's just a type class) concept and the notion of "computational context". An a -> m b is like a a -> b but is allowed to do m-stuff. For a standalone m a, it's slightly trickier-- an a will never change but an m a like getChar :: IO Char can have a different value every time it's computed-- but one can think of it as isomorphic to () -> m a, a type signature that you rarely see in Haskell, but a valid one.