[GHC] #13042: Allow type annotations / visible type application in pattern synonyms

GHC ghc-devs at haskell.org
Mon Jan 2 15:09:27 UTC 2017


#13042: Allow type annotations / visible type application in pattern synonyms
-------------------------------------+-------------------------------------
        Reporter:  Iceland_jack      |                Owner:
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
                                     |  TypeApplications, PatternSynonyms
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by goldfire):

 This ''is'' different. In my typical understanding of type application in
 patterns (forgetting about pattern synonyms for a moment), I think of type
 arguments only for ''existential'' type parameters. For example:

 {{{#!hs
 foo (Just @a x) = (x :: a)  -- NO! `a` is universally bound
 bar (Just @Int x) = x       -- NO! This looks like it's doing runtime type
 matching

 data E where
   MkE :: a -> E
 baz (MkE @a x) = ...        -- OK. `a` is existential
 }}}

 The implicit proposal above includes visible type application for
 universals... but with different typing behavior than I had considered. I
 always thought that a pattern like `Just @Int x` would be some abominable
 pattern that matched against `Maybe a`, but then checked whether `a` was
 in fact `Int`. (This is just like how `Just True` only matches when the
 payload is in fact `True`.) For universals, though, there is a different
 typing interpretation: `Just @Int x` is a pattern against `Maybe Int`, and
 only `Maybe Int`. Trying to match something of type `Maybe a` against
 `Just @Int x` is a straightforward type error.

 What's challenging here is that modern patterns have arguments that go in
 both directions (that is, required vs provided). Normally, everything in a
 pattern is an output -- that is, something that is bound upon a successful
 pattern match. The one exception to this rule has been constructors, which
 are inputs. (View patterns are another way of providing inputs, which is
 why they are so interesting in the context of pattern synonyms.) Above is
 proposed adding universal type applications as inputs...  an idea I think
 I like.

 A beautiful thing about adding universal type applications as inputs is
 that it greatly simplifies the design of type applications in patterns. I
 had been thinking that we allow type applications only for existential
 variables (as in my example above), but then the ordering of type
 applications might have a different meaning in a constructor expression
 than it would in a constructor pattern, which is very confusing. (See
 comment:1:ticket:11638 for further thoughts, as well as #11350 for the
 ticket about type applications in patterns in general.)

 Or have I utterly misunderstood the original post?

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


More information about the ghc-tickets mailing list