This is a series where I write lesson(s) learned during the day, so that I remember them better. Hopefully you take away something too!
You can represent abstract data types also as procedures, and not just static data laid out in a certain shape. For example, you can represent a graphics program paused procedures that will eventually draw the shape you want, and then manipulate those procedures with higher-order functions, e.g. wrapping a procedure that draws a dog with a function that skews the image and then another procedure that repeats that image.
The idea of a set being closed under an operation applies to programming languages as well, where this time the set is the data structures and the operations your functions that operate on those data structure types. Using this lens when designing can help you increase the flexibility from the end user perspective of what you make.