I remember the first time I read the Monad instance for ContT I was so confused. I couldn't fathom how it worked because it was hard to discern the pattern. However, I later discovered that renaming things makes the pattern much more clear: import Control.Applicative newtype ContT x m r = ContT { (>>-) :: (r -> m x) -> m x } instance Functor (ContT x m) where fmap f m = ContT $ \_return -> -- fmap