In this chapter, we covered how to package types and values together with modules, how to specify exactly what surface area we want to expose from our modules using signatures, and how to keep tight control over our data types using the combination of modules and signatures–even to the extent of controlling the memory allocation of data in our modules. In Reason, you'll notice this pattern a lot–you design the types to ensure that certain rules are enforced, and in a lot of situations, they will be enforced at no runtime cost.
So, stay tuned—in the next chapter, we will cover some of the most important types that we use on a daily basis in type-driven development: product types that group values together for easy access.