Christine Gundry, Andres Löh
Thursday, 14 October 2021
An important factor affecting compilation speed and memory requirements is the size of the core code generated by
ghc from Haskell source modules. Thus, if compilation time is an issue, this is something we should be conscious of and optimize for. In part 1 of this blog post we took an in-depth look at why certain Haskell constructs lead to quadratic blow-up in the generated
ghc core code, and how the
large-records library avoids these problems. Indeed, the
large-records library provides support for records, including support for generic programming, with a guarantee that the generated core is never more than
O(n) in the number of record fields.
The approach described there does however not directly apply to the case of anonymous records. This is the topic we will tackle in this part 2. Unfortunately, it seems that for anonymous records the best we can hope for is
O(n log n), and even to achieve that we need to explore some dark corners of
ghc. We have not attempted to write a new anynomous records library, but instead consider the problems in isolation; on the other hand, the solutions we propose should be applicable in other contexts as well. Apart from section Putting it all together, the rest of this blog post can be understood without having read part 1.