[GHC] #12187: Clarify the scoping of existentials for pattern synonym signatures

GHC ghc-devs at haskell.org
Thu Jun 16 16:04:50 UTC 2016


#12187: Clarify the scoping of existentials for pattern synonym signatures
-------------------------------------+-------------------------------------
        Reporter:  mpickering        |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
                                     |  PatternSynonyms
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:  #12108            |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 I propose the following:

 * The universal type variables are the ones free in
   * any explicitly-forall'd universal variables
   * the required context (if any)
   * the result type, after deleting any explicitly-forall'd existentials.

 * For this purpose the "result type" is very narrowly interpreted, as
 follows: first drop the required and provided contexts, if present.  Now
 drop arrows (only).  What's left is the result type.  In this suggestion,
 even parentheses stop the "dropping arrows" bit.  For example:
 {{{
 pattern X :: a -> (b -> T a)
 }}}
   Here the "result type" is `(b -> T a)`.

 * The existentials are all the rest


 This rule is simple and predictable. For `Q` in the description, both `a`
 and `b` are universal, because the result type is `Disguised a b` and both
 `a` and `b` are free.

 Moreover, you can always override it by using explicit foralls, to get
 what you want.  E.g.
 {{{
 pattern Q :: () => forall b. Eq b => Disguised a b
 }}}
 The `forall` means that `b` is no longer free in the result type

 Yes we could "look through" parens.  Yes, we could "look through" type
 synonyms, although that is harder because scopging is determined in the
 renamer.  But it's a slippery slope; e.g. what about type functions?   I
 say keep it simple.

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


More information about the ghc-tickets mailing list