  The use of a necessity modality in a typed $\lambda$-calculus can be used to
separate it into two regions. These can be thought of as intensional vs.
extensional data: data in the first region, the modal one, are available as
code, and their description can be examined. In contrast, data in the second
region are only available as values up to ordinary equality. This allows us to
add non-functional operations at modal types whilst maintaining consistency. In
this setting, the G\"odel-L\"ob axiom acquires a novel constructive reading: it
affords the programmer the possibility of a very strong kind of recursion which
enables them to write programs that have access to their own code. This is a
type of computational reflection that is strongly reminiscent of Kleene's
Second Recursion Theorem.
