Originally motivated by a desire for an error monad and generic option type operations, and stood for Higher Order Programming in Erlang. Soon after, I wished all standard containers used consistent conventions and protocols (such as consistent accessor names, argument positioning rules and expression of semantics with option and result types).