Heres what finally got me to understand monads, including some of the context around them:<p>1. Why is it important that a List is a monad?<p>A. Its not particularly important. Its really just pointing out that monad is a very general abstraction - it wont tell you anything you don&#x27;t already know about Lists.<p>On the other side, lists as kind of trivial examples of monads - they didnt really help me understand monads either.<p>Its like saying 1 is a real number - true, but it wont help you understand real numbers.<p>2. Why should i use monads?<p>A: I like to think of monads as things you can use in a for-comprehension (or the do notation in Haskell). If you can imagine writing something like<p><pre><code>  for {x &lt;- thing; y&lt;-thing} x + y
</code></pre>
for &quot;thing&quot;, then &quot;thing&quot; might be a monad (assuming all the math laws work out - sometimes they don&#x27;t). In scala, for-comprehensions are literally de-sugared into maps&#x2F;flatMaps&#x2F;filters so for comprehension without filter &lt;=&gt; monad.<p>3. But a monad is just a monoid in the category of endofunctors?<p>A: There is deep category theory and math behind this stuff. It can be useful to talk about it, but when you are starting out its overkill. Don&#x27;t worry about &quot;getting&quot; the really abstract crap at first, just skim right over. Programming in monads is a lot easier than the theory, and the theory can be learned after getting your hands dirty. Using monads is mostly just for-comprehensions.<p>ps:<p>&quot;monoid&quot; = there is a zero, and an add operation. like integers with +, or integers with *).<p>&quot;functor&quot; = thing that has a map() operation.<p>&quot;endo&quot; = self<p>&quot;category&quot; = kind of like a set. its a container.<p>So a monad has a &quot;zero&quot; or default monad, a way to add monads, and a map operation that returns another monad.<p>e.g List -&gt; zero = Nil, add = append, map = the &quot;normal&quot; map with f applied to each element<p>Future -&gt; zero = empty Future, add = do future2 after future1, map = make a future with the f applied to value