Refactor ConDecl
The ConDecl
type in HsDecls
is an uneasy compromise. For the most part, HsSyn
directly reflects the syntax written by the programmer; and that gives just the right "pegs" on which to hang Alan's APIannotations. But ConDecl
doesn't properly reflect the syntax of Haskell-98 and GADT-style data type declarations.
To be concrete, here's a draft new data type
data ConDecl name
| ConDeclGADT
{ con_names :: [Located name]
, con_type :: LHsSigType name -- The type after the ‘::’
, con_doc :: Maybe LHsDocString }
| ConDeclH98
{ con_name :: Located name
, con_qvars :: Maybe (LHsQTyVars name)
-- User-written forall (if any), and its implicit
-- kind variables
-- Non-Nothing needs -XExistentialQuantification
, con_cxt :: Maybe (LHsContext name)
-- ^ User-written context (if any)
, con_details :: HsConDeclDetails name
-- ^ Arguments
, con_doc :: Maybe LHsDocString
-- ^ A possible Haddock comment.
} deriving (Typeable)
Note that
- For GADTs, just keep a type. That's what the user writes. (NB:
HsType
can represent records on the LHS of an arrow:{ x:Int,y:Bool } -> T
-
con_qvars
andcon_cxt
are bothMaybe
because they are both optional (theforall
and the context of an existential data type - For
ConDeclGADT
the type variables of the data type do not scope over thecon_type
; whereas forConDeclH98
they do scope overcon_cxt
andcon_details
.
This ticket is just to track the thought and invite feedback.