One thing struck me as odd reading this: he skips over the implementation of the Make functor, which is the interesting bit. But looking at [1], I realized it was a bit hairy. For a maybe more approachable example of a Make functor, you can have a look at [2] around line 1181: given a module with a type t and a comparator function, it creates a module for a set of elements of type t.
That said, it's a really nice set of posts, and they're the initial reason I started to get interested in the language.
Yes, and this hairiness is the main reason the abstraction is useful. If you want to add support for e.g. dependencies on source code, cross-compilation, multiple scopes, etc, you can now do so without looking at the hairy code at all, because the type signature tells you everything you need to know about it and is abstract enough to support what you want.
And if you do need to work on it, you don't need to think about the rest of the program at the same time.
And if you do need to work on it, you don't need to think about the rest of the program at the same time.
e.g. because you want to make it less hairy ;-)