In January, we presented our work on Explicit Level Imports at the Trends in Functional Programming symposium. We’re pleased to announce that the paper was awarded the the John McCarthy Prize for best paper overall!

The paper introduces the ExplicitLevelImports extension to GHC, which gives programmers fine-grained control over which modules and dependencies are required by Template Haskell. For instance, in the following example, the splice import tells the compiler that Control.Lens.TH is needed only at compile time and not at runtime:

import splice Control.Lens.TH (makeLenses)
import App (S)
data T = MkT { foo :: S }
$(makeLenses ''T )

By taking advantage of this extra information, the compiler can perform less work in certain situations. In one benchmark, we modified pandoc to use ExplicitLevelImports and compilation time was halved when using -fno-code. For full details, read the paper or check out GHC Proposal #682. The implementation has landed in GHC MR !14241, so ExplicitLevelImports will be available in the next major release of GHC (9.14).

Explicit Level Imports

Matthew Pickering, Rodrigo Mesquita, Adam Gundry

TFP 2025 (PDF) (Awarded John McCarthy Prize for best paper overall)

Abstract. Cross-stage persistence rules are commonly admitted in multi- stage programming languages. These rules codify the assumption that all module and package dependencies are available at all stages. However, in practice, only a small number of dependencies may be needed at each particular stage.

This paper introduces Explicit Level Imports, a mechanism which gives programmers precise control about which dependencies are required at each stage. Imports are annotated with a modifier which brings identifiers into scope at a specific level. This precision means it is straightforward for the compiler to work out what is exactly needed at each stage, and only provide that. The result is faster compilation times and the potential for improved cross-compilation support.

We have implemented these ideas in GHC Haskell, consider a wide variety of practical considerations in the design, and finally demonstrate that the feature solves a real-world issue in a pragmatic way.