This module uses Template Haskell to distinguish closed terms, so that the
library can trust such functions to not contain any
Name values in their
Cl a represents a closed term of type
i.e., an expression of type
a with no free (Haskell) variables.
Since this cannot be checked directly in the Haskell type system,
Cl data type is hidden, and the user can only create
closed terms using Template Haskell, through the
b applies a closed function
f to the body of
b. For example:
mbApplyCl $(cl [| f |]) (nu $ \n -> n) = nu f
mbLiftClosed is safe because closed terms don't contain names.
noClosedNames encodes the hobbits guarantee that no name can escape its