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:
HsTypecan represent records on the LHS of an arrow:{ x:Int,y:Bool } -> T -
con_qvarsandcon_cxtare bothMaybebecause they are both optional (theforalland the context of an existential data type - For
ConDeclGADTthe type variables of the data type do not scope over thecon_type; whereas forConDeclH98they do scope overcon_cxtandcon_details.
This ticket is just to track the thought and invite feedback.
Edited by Simon Peyton Jones