Skip to content
  • Ryan Scott's avatar
    e07e383a
    Replace HsImplicitBndrs with HsOuterTyVarBndrs · e07e383a
    Ryan Scott authored and Marge Bot's avatar Marge Bot committed
    
    
    This refactors the GHC AST to remove `HsImplicitBndrs` and replace it with
    `HsOuterTyVarBndrs`, a type which records whether the outermost quantification
    in a type is explicit (i.e., with an outermost, invisible `forall`) or
    implicit. As a result of this refactoring, it is now evident in the AST where
    the `forall`-or-nothing rule applies: it's all the places that use
    `HsOuterTyVarBndrs`. See the revamped `Note [forall-or-nothing rule]` in
    `GHC.Hs.Type` (previously in `GHC.Rename.HsType`).
    
    Moreover, the places where `ScopedTypeVariables` brings lexically scoped type
    variables into scope are a subset of the places that adhere to the
    `forall`-or-nothing rule, so this also makes places that interact with
    `ScopedTypeVariables` easier to find. See the revamped
    `Note [Lexically scoped type variables]` in `GHC.Hs.Type` (previously in
    `GHC.Tc.Gen.Sig`).
    
    `HsOuterTyVarBndrs` are used in type signatures (see `HsOuterSigTyVarBndrs`)
    and type family equations (see `HsOuterFamEqnTyVarBndrs`). The main difference
    between the former and the latter is that the former cares about specificity
    but the latter does not.
    
    There are a number of knock-on consequences:
    
    * There is now a dedicated `HsSigType` type, which is the combination of
      `HsOuterSigTyVarBndrs` and `HsType`. `LHsSigType` is now an alias for an
      `XRec` of `HsSigType`.
    * Working out the details led us to a substantial refactoring of
      the handling of explicit (user-written) and implicit type-variable
      bindings in `GHC.Tc.Gen.HsType`.
    
      Instead of a confusing family of higher order functions, we now
      have a local data type, `SkolemInfo`, that controls how these
      binders are kind-checked.
    
      It remains very fiddly, not fully satisfying. But it's better
      than it was.
    
    Fixes #16762. Bumps the Haddock submodule.
    
    Co-authored-by: default avatarSimon Peyton Jones <simonpj@microsoft.com>
    Co-authored-by: Richard Eisenberg's avatarRichard Eisenberg <rae@richarde.dev>
    Co-authored-by: default avatarZubin Duggal <zubin@cmi.ac.in>
    e07e383a
    Replace HsImplicitBndrs with HsOuterTyVarBndrs
    Ryan Scott authored and Marge Bot's avatar Marge Bot committed
    
    
    This refactors the GHC AST to remove `HsImplicitBndrs` and replace it with
    `HsOuterTyVarBndrs`, a type which records whether the outermost quantification
    in a type is explicit (i.e., with an outermost, invisible `forall`) or
    implicit. As a result of this refactoring, it is now evident in the AST where
    the `forall`-or-nothing rule applies: it's all the places that use
    `HsOuterTyVarBndrs`. See the revamped `Note [forall-or-nothing rule]` in
    `GHC.Hs.Type` (previously in `GHC.Rename.HsType`).
    
    Moreover, the places where `ScopedTypeVariables` brings lexically scoped type
    variables into scope are a subset of the places that adhere to the
    `forall`-or-nothing rule, so this also makes places that interact with
    `ScopedTypeVariables` easier to find. See the revamped
    `Note [Lexically scoped type variables]` in `GHC.Hs.Type` (previously in
    `GHC.Tc.Gen.Sig`).
    
    `HsOuterTyVarBndrs` are used in type signatures (see `HsOuterSigTyVarBndrs`)
    and type family equations (see `HsOuterFamEqnTyVarBndrs`). The main difference
    between the former and the latter is that the former cares about specificity
    but the latter does not.
    
    There are a number of knock-on consequences:
    
    * There is now a dedicated `HsSigType` type, which is the combination of
      `HsOuterSigTyVarBndrs` and `HsType`. `LHsSigType` is now an alias for an
      `XRec` of `HsSigType`.
    * Working out the details led us to a substantial refactoring of
      the handling of explicit (user-written) and implicit type-variable
      bindings in `GHC.Tc.Gen.HsType`.
    
      Instead of a confusing family of higher order functions, we now
      have a local data type, `SkolemInfo`, that controls how these
      binders are kind-checked.
    
      It remains very fiddly, not fully satisfying. But it's better
      than it was.
    
    Fixes #16762. Bumps the Haddock submodule.
    
    Co-authored-by: default avatarSimon Peyton Jones <simonpj@microsoft.com>
    Co-authored-by: Richard Eisenberg's avatarRichard Eisenberg <rae@richarde.dev>
    Co-authored-by: default avatarZubin Duggal <zubin@cmi.ac.in>
Loading