Identifying an abstraction and building a function for it
Using existing functions to build more complex abstractions
Passing existing functions to other functions to build even more complex abstractions
However, functions are not enough. In fact, functional programming very often works best when implemented in concert with powerful data ab...