We want to construct a pipeline of compilers to go from our resource to a
proper webpage. However, the layout compiler takes more than just the
rendered page as input: it needs the templates/fancy.html template as well.

This is an example of where we need the require function. We can solve
this using a construction that looks like:

These are constraints for the a type. a (the template) needs to have
certain properties for it to be required.

Identifier

This is simply templates/fancy.html: the Identifier of the item we want
to require, in other words, the name of the item we want to add to the
pipeline somehow.

(b -> a -> c)

This is a function given by the user, specifying how the two items shall be
merged. b is the output of the previous compiler, and a is the item we
just required -- the template. This means c will be the final output of the
require combinator.

Compiler b c

Indeed, we have now constructed a compiler which takes a b and produces a
c. This means that we have a linear pipeline again, thanks to the require
function. So, the require function actually helps to reduce to complexity
of Hakyll applications!