[GHC] #10928: Refine pattern synonym signatures

GHC ghc-devs at haskell.org
Mon Oct 5 10:52:41 UTC 2015


#10928: Refine pattern synonym signatures
-------------------------------------+-------------------------------------
        Reporter:  mpickering        |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:  8.0.1
       Component:  Compiler          |              Version:  7.10.2
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  Other             |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
-------------------------------------+-------------------------------------
Description changed by simonpj:

Old description:

> > I think that the current state of pattern synonym signatures is quite
> > confusing, especially regarding the constraints. For those unfamiliar,
> > a signature looks like the following,
> >
> > {{{
> > pattern ExNumPat :: (Show b) => (Num a, Eq a) => b -> T a
> > }}}
> >
> > The first constraint being the "provided constraints" and the second
> > the "required constraints".
> >
> > My main concern is when only a single constraint is specified then
> > these are treated as the provided constraints. The manual gives the
> > reason that this is the "more common" choice. It seems that this
> > motivation is driven by the original ticket which had a lengthy
> > discussion about GADTs. In my experience, the opposite is true, it is
> > more common to have required constraints.
> >
> > This is true especially in a few common cases such as `pattern Foo =
> > 27`, where users define pattern synonyms which have (overloaded)
> > literals on the RHS. The most general signature for such a pattern is
> > `pattern :: () => (Eq a, Num a) => a`.
> >
> > For this reason, I think it would be better if either
> >
> > 1. Only specifying one constraint corresponded to the required
> constraints
> > 2. We required users to specify both sets of constraints, even if the
> provided constraints are empty.
> >
> > In terms of breakage, I don't think that pattern synonym signatures
> > are widely used yet. In both schemes it is possible to write backwards
> > compatible code by writing both sets of constraints.
> >
> > I think a lot of the confusion also arises from the unusual form of
> > the signature, it is unusual to specify two sets of constraints and I
> > suspect users tends to assume that a single set of constraints is
> > either provided or required depending on what they want it to mean.
> > Forcing the specification of both, forces the user to make the
> > distinction earlier rather than trying to decipher error messages.
> >
>
> This is copied from a message sent to ghc-devs. This ticket is to track
> the progress.

New description:

 > I think that the current state of pattern synonym signatures is quite
 > confusing, especially regarding the constraints. For those unfamiliar,
 > a signature looks like the following,
 >
 > {{{
 > pattern ExNumPat :: (Show b) => (Num a, Eq a) => b -> T a
 > }}}
 >
 > The first constraint being the "provided constraints" and the second
 > the "required constraints".
 >
 > My main concern is when only a single constraint is specified then
 > these are treated as the provided constraints. The manual gives the
 > reason that this is the "more common" choice. It seems that this
 > motivation is driven by the original ticket which had a lengthy
 > discussion about GADTs. In my experience, the opposite is true, it is
 > more common to have required constraints.
 >
 > This is true especially in a few common cases such as `pattern Foo =
 > 27`, where users define pattern synonyms which have (overloaded)
 > literals on the RHS. The most general signature for such a pattern is
 > `pattern :: () => (Eq a, Num a) => a`.
 >
 > For this reason, I think it would be better if either
 >
 > 1. Only specifying one constraint corresponded to the required
 constraints
 > 2. We required users to specify both sets of constraints, even if the
 provided constraints are empty.
 >
 > In terms of breakage, I don't think that pattern synonym signatures
 > are widely used yet. In both schemes it is possible to write backwards
 > compatible code by writing both sets of constraints.
 >
 > I think a lot of the confusion also arises from the unusual form of
 > the signature, it is unusual to specify two sets of constraints and I
 > suspect users tends to assume that a single set of constraints is
 > either provided or required depending on what they want it to mean.
 > Forcing the specification of both, forces the user to make the
 > distinction earlier rather than trying to decipher error messages.
 >

 This is copied from [https://mail.haskell.org/pipermail/ghc-
 devs/2015-October/010024.html a message sent to ghc-devs]. This ticket is
 to track the progress. But read the email thread for other comments!

--

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10928#comment:4>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list