Developed for the intermediate-to-professional Haskell programmer looking for a deeper understanding of the type system and its extensions. Thinking with Types emphasizes writing code that is compiler-verified to be correct, safe, and user-friendly. The author has carefully presented the material in an accessible manner—realizing that not everyone who wishes to learn about type-level programming is a post-doctorate in mathematics. This book covers the majority of Haskell’s type-related language extensions, including rank-n types, GADTs, type families, dependent types and rebindable syntax. Throughout early chapters, readers are introduced to the core fundamentals of type systems, and later chapters refine these ideas, often employing many of them simultaneously to accomplish real-world goals.