[GHC] #10928: Refine pattern synonym signatures

GHC ghc-devs at haskell.org
Wed Oct 7 11:33:34 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):
-------------------------------------+-------------------------------------

Comment (by rwbarton):

 Thinking about this some more it seems wrong to change the operator used
 for provided constraints, since the whole type of a constructor in a GADT
 declaration
 {{{
 data T a where
   MkT :: (Show a, Show b) => a -> b -> T a
 }}}
 should be a unit in the type of a pattern
 {{{
 pattern MkT :: (Show a, Show b) => a -> b -> T a
 }}}
 Or looking at it another way, the fields of type `a` and `b`, despite
 being provided by a match on the pattern, appear in negative position in
 the type; so the provided context `(Show a, Show b)` should also appear in
 negative position too, which is the normal role of `=>`.

 So if we're going to use two different operators here, the non-`=>` one
 should mark the required constraints, like
 {{{
 pattern P :: (Eq a, Num a) ??> (Show a, Show b) => b -> T a
 }}}
 But this is somehow a bit less appealing to me, since I don't see how this
 other operator `??>` could make sense in any other context.

 We have provided constraints, provided values (the values bound by a
 matching pattern), required constraints, but no required values. That's
 PatternFamilies. However there is no proposed syntax for the type of a
 pattern family there. It might be worthwhile to try to solve that problem
 at the same time. For example a syntax that would accommodate required
 arguments (while being rather ugly and perhaps unparseable) could be
 {{{
 pattern ReqC => ReqVal1 -> ReqVal2 -> P :: ProvC => ProvVal1 -> ProvVal2
 -> Res
 }}}
 This also happens to be backwards compatible in the case where `ReqC =>
 ReqVal1 -> ReqVal2 -> ` is empty.

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


More information about the ghc-tickets mailing list