Note [Pattern signature binders and scoping]
Consider the pattern signatures like those on `t` and `g` in:
f = let h = \(t :: (b, b) ->
\(g :: forall a. a -> b) ->
...(t :: (Int,Int))...
in woggle
* The `b` in t's pattern signature is implicitly bound and scopes over
the signature and the body of the lambda. It stands for a type (any type);
indeed we subsequently discover that b=Int.
(See Note [TyVarTv] in GHC.Tc.Utils.TcMType for more on this point.)
* The `b` in g's pattern signature is an /occurrence/ of the `b` bound by
t's pattern signature.
* The `a` in `forall a` scopes only over the type `a -> b`, not over the body
of the lambda.
* There is no forall-or-nothing rule for pattern signatures, which is why the
type `forall a. a -> b` is permitted in `g`'s pattern signature, even though
`b` is not explicitly bound. See Note [forall-or-nothing rule].
Similar scoping rules apply to term variable binders in RULES, like in the
following example:
{-# RULES "h" forall (t :: (b, b)) (g :: forall a. a -> b). h t g = ... # References 2
- TyVarTv GHC.Tc.Utils.TcMType
- forall-or-nothing rule Language.Haskell.Syntax.Type
Referenced by 6
- GHC.Rename.HsType call site ×2
- GHC.Hs.Type call site
- HsType binders Language.Haskell.Syntax.Type
- Language.Haskell.Syntax.Type call site
- Lexically scoped type variables Language.Haskell.Syntax.Type