ADTs are a common and powerful way of representing data. Scala encodes them in a way that is (currently) a bit manual and heavy on the boilerplate, and there are a few rules to respect in order for the resulting types to be well behaved and idiomatic. This is what this section will be focusing on.