Monads and Friends
My take on monads and friends
Vanilla: (a → b) × a → b
┌─┐ ┌─┐
Functor: (a → b) × │a│ → │b│
└─┘ └─┘
┌─┐ ┌─┐ ┌─┐
Monad: (a → │b│) × │a│ → │b│
└─┘ └─┘ └─┘
┌───────┐ ┌─┐ ┌─┐
Applicative: │(a → b)│ × │a│ → │b│
└───────┘ └─┘ └─┘
There are plenty of monad tutorials out there, but this is how they make sense to me and maybe it will help you too. There are some minor variations I have made which highlights their similarities and differences.
Notation and Differences
a
and b
are type variables and could be replaced by anything like int
, string
, float
or whatever your language gives you. The box around a
/b
(which you might see as f a
/f b
in another context, but is not as sightly) are things like lists, objects, or anything that can contain a value of type a
/b
. →
is a function and ×
gives the list of arguments (again, you will probably see →
being used for this purpose, but we don’t care about currying right now). You might also notice I have some arguments ordered differently.
The idea
The four things I’ve given above — vanilla (my made up word on plain function application), functor, monad, & applicative — have a function (F
for shorthand) of 2 arguments, one of which is a function, the other is some value. F
takes the function and applies it to the value. The exact details of how it does this application is not completely specified by the types alone, but gives us a rough idea on what is going on. We’re also missing some way of creating a boxed a
from an a
, but these are not as interesting.
The whole idea is that we have 4 different patterns of applying a function to a value. These patterns save us from writing the same pieces of code in every function we want to operate on a new box.
Takeaway
Even if your language doesn’t let/require you to write down types, these concepts are still there and still worthwhile to become familiar with. I have left out a lot of details and you should go fill those in from somewhere else. But for me, those 4 type signatures capture everything I find important and it looks nice!