We are now comfortable with the idea of using functions as first-class values, which means that the can be bound to variables, passed to functions, and treated like pretty much any other value.
This lecture introduces lazy programming, which entails programming by trying to do as little work as possible, until it is absolutely necessary. For instance, when mapping a function onto a list, SML will eagerly compute each new entry, even if we don't use any of the entries for anything.
We can simulate such lazy structures by using thunks, which
are functions that take in a useless
unit parameter, which suspends the
body of the function, causing no computations to occur. This lets us define
lazy data structures, which compute elements only when they
are asked for them. This results in less work overall, and the ability to
theoretically store "infinitely" many elements.
In addition to lazy lists, we discussed streams, which are lazy lists that are maximally lazy, by making sure that the least amount of work is done when the stream is not being actively queried for elements.