Summary
We started this chapter from GHC internal representation Core. We looked at the differences in Core syntax as opposed to Haskell syntax, among them explicit boxing, recursive bindings, explicit specialization and the passing of class dictionaries. Next, we took a glance at STG, the next internal representation after Core that's even simpler. Then we considered how GHC exposes its primitives: magic hash, unlifted types, and the unlifted kind.
Our second subject was code generation with GHC using GHC Generics. The essential idea with Generics is to represent every datatype as a sum of products using a handful of indexed datatypes (:+:
, :*:
, and so on). It then becomes easy to write general functions over all datatypes by converting to or from the general sum-of-products representation. Then we looked at full-blown code generation using Template Haskell, which enabled us to generate code, declarations and expressions by directly manipulating the program's abstract syntax tree...