Higher order functions
Higher order functions are functions that take functions as arguments. This is a very powerful technique that allows us to write general functions. This is a form of polymorphism, where one function can be used over many different data types. It also allows us to encapsulate partial computations or closures, that can later be executed in another environment. This can be handy when we want to represent an infinite data structure.