[GHC] #11638: referring to the existential type from a GADT pattern match with a type application

GHC ghc-devs at haskell.org
Wed Feb 24 19:00:18 UTC 2016


#11638: referring to the existential type from a GADT pattern match with a type
application
-------------------------------------+-------------------------------------
           Reporter:  rwbarton       |             Owner:
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.1
  (Type checker)                     |
           Keywords:                 |  Operating System:  Unknown/Multiple
  TypeApplications                   |
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:  #11387
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Currently I can define a GADT like
 {{{
 data T where
   MkT :: forall a. (Num a, Show a) => T
 }}}
 but it's useless on two counts:

 * At a use of the constructor `MkT`, I can't specify what type `a` I want
 to pack dictionaries for. (In fact the declaration is an error unless
 either the constraints are defaultable (as in the case above) or
 AllowAmbiguousTypes is enabled.)

 * At a pattern match against `MkT`, I have no way to refer to the type for
 which dictionaries were packed.

 The solution is to add a field of type `Proxy a` (possibly
 strict/unpacked) or `Proxy# a` to `MkT`. But these options are all a bit
 verbose and each have minor drawbacks.

 I had hoped that TypeApplications would address the two points above
 directly.

 * At a use of the constructor `MkT`, specify the type with a type
 application `MkT @a`. This part works as of
 90f35612f16ff9cb2466cc936f12e748402abb85.

 * At a pattern match against `MkT`, I would like to be able to match the
 type directly like this:
 {{{
 f :: T -> String
 f t = case t of
   MkT @a -> show (0 :: a)
 }}}

 This is the feature request.

 Note that, while this may be stressful for the parser due to as-patterns,
 I don't think there is any actual ambiguity as long as (1) type
 applications only appear on constructors, not variables, and (2) all type
 applications appear before any value-level fields of the constructor.

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


More information about the ghc-tickets mailing list