Functors, Applicatives, and Monads in Plain English
His &#x27;plain english&#x27; descriptions are really just the definition in Haskell. Haskell defines one or two more methods for efficiency, but if you ignore the entries with default implementations you get:<p>1. &quot;Functors are containers you can call map on. That&#x27;s it. Seriously.&quot;<p><pre><code>    class  Functor f  where
      fmap        :: (a -&gt; b) -&gt; f a -&gt; f b
</code></pre>
Historically, fmap in Haskell used to be called map. They gave it a different name so that error messages would appear less abstract when working with lists.<p><pre><code>    fmap (+2) [5] = [7]
</code></pre>
2. &quot;you may want to have a function in the container and apply it to value(s) in another container of the same kind. &quot;<p><pre><code>    class Functor f =&gt; Applicative f where
      -- | Lift a value.
      pure :: a -&gt; f a

      -- | Sequential application.
      (&lt;*&gt;) :: f (a -&gt; b) -&gt; f a -&gt; f b
</code></pre>
So at least in Haskell, he describes the sequential application operator but leaves out the ability to lift a pure value to a container value.<p><pre><code>    pure 5 = [5]

    [(+2)] &lt;*&gt; [5] = [7]
</code></pre>
3. &quot;Monads are containers you can call flatMap on. Again, that&#x27;s it.&quot;<p><pre><code>    class Applicative m =&gt; Monad m where
      -- | Sequentially compose two actions, passing any value produced
      -- by the first as an argument to the second.
      (&gt;&gt;=)       :: forall a b. m a -&gt; (a -&gt; m b) -&gt; m b
</code></pre>
And here&#x27;s how to use it like a flatmap:<p><pre><code>    [1,2] &gt;&gt;= (\x -&gt; [x + 5, x + 10])
    [6,11,7,12]
</code></pre>
That&#x27;s [1 + 5, 1 + 10, 2 + 5, 2 + 10] if you didn&#x27;t catch that.<p>Usually these also come with some laws to help you reason about the typeclass, but looking purely at the language level it can help to remember that a Functor, Applicative, or Monad are nothing more than a type together with some functions with a certain signature.<p>I find it&#x27;s usually more useful for a beginner to just start writing code without all the abstractions. Once they have a pile of code and start to want to clean it up a bit, it&#x27;s not too hard to start stacking some monad transformers.