[GHC] #11028: Refactor ConDecl
GHC
ghc-devs at haskell.org
Mon Nov 23 22:57:34 UTC 2015
#11028: Refactor ConDecl
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: alanz
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.2
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Old description:
> 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
> [wiki:ApiAnnotations API annotations]. 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_implict :: HsImplicitBndrs ()
> -- ^ Implicit binders, added by renamer
>
> , con_qvars :: Maybe [LHsTyVarBndr name]
> -- User-written foralls (if any)
>
> , 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` and `con_cxt` are both `Maybe` because they are both
> optional (the `forall` and the context of an existential data type)
>
> This ticket is just to track the thought and invite feedback.
New description:
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
[wiki:ApiAnnotations API annotations]. 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` and `con_cxt` are both `Maybe` because they are both
optional (the `forall` and the context of an existential data type
* For `ConDeclGADT` the type variables of the data type do ''not'' scope
over the `con_type`; whereas for `ConDeclH98` they ''do'' scope over
`con_cxt` and `con_details`.
This ticket is just to track the thought and invite feedback.
--
Comment (by simonpj):
PS: I have edited the proposed data type a bit. Do you agree with it?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11028#comment:9>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list