Summary
This chapter reviewed patterns of kind abstraction. In doing so, we encountered the key ways in which the kind-system has been extended since Haskell 98.
We started with associated type synonyms, which we then placed in the broader context of type families. Next, we explored kind polymorphism and type promotion and found that these kind-system enrichments together raise Haskell to a capable type-level programming language.
As the kind system becomes more powerful, the line between type and term-level programming becomes fainter. Yet, we saw that kinds remain second-class citizens of Haskell.
We concluded with a discussion of dependently-typed programming and how the Haskell language continues to reach more deeply into this paradigm.