What helped me grok monads was to understand that monads are just a subset of functors. Then I did what I could to fully understand what functors were, since at that point they were still a kind of cargo-cult black box for me.<p><pre><code>    let liftF = fmap
    liftF negate (Just 1)
    liftA negate (Just 1)
    liftM negate (Just 1)
</code></pre>
Realizing these all performed the same operation (if operating on a monadic value), and that `fmap` is just a `liftF` (&quot;lift a regular function to work on a functor&quot;), cleared some things up for me.<p>This also helped: <a href="https:&#x2F;&#x2F;en.wikibooks.org&#x2F;wiki&#x2F;Haskell&#x2F;Applicative_functors#A_sliding_scale_of_power" rel="nofollow">https:&#x2F;&#x2F;en.wikibooks.org&#x2F;wiki&#x2F;Haskell&#x2F;Applicative_functors#A...</a><p>So all these abstractions really just let you do different things with functions that normally don&#x27;t take functor arguments. They make the function basically allow functor arguments (kind of), to save writing a lot of boilerplate within your functions; typically boilerplate that would be put at the start of every function.<p>Once someone really gets the idea of what a functor is and why they can be useful, I think the rest is easy to understand once you read the definition of monads and applicatives.