Having briefly looked at Haskell recently, what would be a brief, succinct, practical explanation as to what a monad essentially is?
I have found most expla
You should first understand what a functor is. Before that, understand higher-order functions.
A higher-order function is simply a function that takes a function as an argument.
A functor is any type construction T
for which there exists a higher-order function, call it map
, that transforms a function of type a -> b
(given any two types a
and b
) into a function T a -> T b
. This map
function must also obey the laws of identity and composition such that the following expressions return true for all p
and q
(Haskell notation):
map id = id
map (p . q) = map p . map q
For example, a type constructor called List
is a functor if it comes equipped with a function of type (a -> b) -> List a -> List b
which obeys the laws above. The only practical implementation is obvious. The resulting List a -> List b
function iterates over the given list, calling the (a -> b)
function for each element, and returns the list of the results.
A monad is essentially just a functor T
with two extra methods, join
, of type T (T a) -> T a
, and unit
(sometimes called return
, fork
, or pure
) of type a -> T a
. For lists in Haskell:
join :: [[a]] -> [a]
pure :: a -> [a]
Why is that useful? Because you could, for example, map
over a list with a function that returns a list. Join
takes the resulting list of lists and concatenates them. List
is a monad because this is possible.
You can write a function that does map
, then join
. This function is called bind
, or flatMap
, or (>>=)
, or (=<<)
. This is normally how a monad instance is given in Haskell.
A monad has to satisfy certain laws, namely that join
must be associative. This means that if you have a value x
of type [[[a]]]
then join (join x)
should equal join (map join x)
. And pure
must be an identity for join
such that join (pure x) == x
.