[GHC] #9953: Pattern synonyms don't work with GADTs

GHC ghc-devs at haskell.org
Wed Jan 7 16:31:33 UTC 2015


#9953: Pattern synonyms don't work with GADTs
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                   Owner:  cactus
            Type:  bug               |                  Status:  new
        Priority:  normal            |               Milestone:  7.10.1
       Component:  Compiler (Type    |                 Version:  7.10.1-rc1
  checker)                           |                Keywords:
      Resolution:                    |  PatternSynonyms
Operating System:  Unknown/Multiple  |            Architecture:
 Type of failure:  None/Unknown      |  Unknown/Multiple
      Blocked By:                    |               Test Case:
 Related Tickets:                    |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by simonpj):

 In email Gergo showed the following example:
 {{{
 data T1 a where
    MkT1 :: a -> T1 (Maybe a)

 -- Inferred type pattern P1 :: (t ~ Maybe a) => a -> T t
 pattern P1 x <- MkT x

 -- Inferred type pattern P2 :: a -> [Maybe a]
 pattern P2 x <- [Just x]
 }}}
 When real data constructors are concerned, the types
 {{{
    T1 :: a -> T1 (Maybe a)
    T1 :: (t ~ Maybe a) => a -> T t
 }}}
 are absolutely equivalent.  '''But the two types are not equivalent for
 pattern synonyms.'''
   * When you match against `P1` can match a value of type `T ty`, for any
 `ty`; and you get evidence for `t ~ Maybe a`.
   * But when you match against `P2` you can ''only'' match a value of type
 `T (Maybe ty)`; and you get no equality evidence.

 The difference is manifest in the different inferred types for `P1` and
 `P2`.

 '''Principle''': you should be able to tell the behaviour of a pattern
 synonym whose implementation is hidden, just from its type.  So the types
 of `P1` and `P2` are really different.

 The same principle should apply to explicit, user-supplied type
 signatures.  So if you say
 {{{
 pattern P1 :: a -> T (Maybe a)
 }}}
 it should typecheck all right, but you can then only pattern match on
 values of type `T (Maybe ty)`.

 In short, if you want GADT-like behaviour for a pattern synonym, you can
 get it ''only'' by giving explicit equality constraints in the signature,
 and not by having a complex result type (as you can do for real data
 constructors).

 I had missed this point entirely in my earlier comments -- thank you Gergo
 for pointing it out.

 Are we agreed on that?

 Then we can return to the implementation!

 But I think the user manual deserves a careful look, to make sure that it
 articulates these points.

 Simon

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


More information about the ghc-tickets mailing list