Note [ExplicitTuple]
An ExplicitTuple is never just a data constructor like (,,,).
That is, the `[LHsTupArg p]` argument of `ExplicitTuple` has at least
one `Present` member (and is thus never empty).
A tuple data constructor like () or (,,,) is parsed as an `HsVar`, not an
`ExplicitTuple`, and stays that way. This is important for two reasons:
1. We don't need -XTupleSections for (,,,)
2. The type variables in (,,,) can be instantiated with visible type application.
That is,
(,,) :: forall a b c. a -> b -> c -> (a,b,c)
(True,,) :: forall {b} {c}. b -> c -> (Bool,b,c)
Note that the tuple section has *inferred* arguments, while the data
constructor has *specified* ones.
(See Note [Required, Specified, and Inferred for types] in GHC.Tc.TyCl
for background.)
Sadly, the grammar for this is actually ambiguous, and it's only thanks to the
preference of a shift in a shift/reduce conflict that the parser works as this
Note details. Search for a reference to this Note in GHC.Parser for further
explanation. References 1
- Required, Specified, and Inferred for types GHC.Tc.TyCl
Referenced by 2
- GHC.Parser call site
- Language.Haskell.Syntax.Expr call site