So far in this course we have only discussed functions which take in basic values and return other basic values. In this lecture, we introduced the idea of higher-order functions, which are functions which may take functions as inputs and return other functions.
We saw that although all SML functions are defined to take in precisely one input and return one output, we can define curried functions as functions which may return other functions, essentially letting us define families of functions with increasingly specialized behavior.
Together with parametric polymorphism, we learned about the "HOF Zoo", or the basic fundamental higher-order functions on lists which encapsulate the behavior of many common design patterns. These included map, filter, foldl, and foldr. We saw that we could specialize each to define many functions that we've already seen in this class.
This lecture marks one of the first where we begin to unlock the true power of functional programming. Higher-order functions are an extremely powerful and cool idea that let us write code templated over other code in a safe and expressive way.