Summary
In this chapter, we explored the three primary kinds of "glues" that Haskell provides: functions, the type system, and lazy evaluation. We did so by focusing on composability of these building blocks and found that wherever we can compose, we are able to decompose, decouple, and modularize our code.
We also looked at the two main kinds of polymorphism (parametric and ad hoc) as they occur in Haskell.
This chapter set the scene for starting our study of design patterns for purely functional programming in Haskell.
The next chapter will focus on patterns for I/O. Working on I/O in the face of lazy evaluation is a minefield, and we would do well with some patterns to guide us.