[GHC] #16278: Exhaustivity checking GADT with free variables

GHC ghc-devs at haskell.org
Mon Feb 4 15:28:23 UTC 2019


#16278: Exhaustivity checking GADT with free variables
-------------------------------------+-------------------------------------
        Reporter:  andrewthad        |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.6.3
      Resolution:                    |             Keywords:
                                     |  PatternMatchWarnings
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 andrewthad):

 I guess `Any` isn't really a nullary type family since the `k` argument is
 invisible. So,  the special case that needs to be handled to make this
 work is "all empty type families, regardless of arity". But I think it
 could be done a little more broadly. Playing with the type checker, I
 found that this compiles:

 {{{#!haskell
 {-# language DataKinds #-}
 {-# language TypeFamilies #-}
 module TypeEqualities where
 type family Foo (b :: Bool) :: Bool
 foo :: (Foo 'True ~ 'True, Foo 'True ~ Foo 'False) => Int
 foo = 5
 }}}

 My interpretation of this is that type family applications that do not
 reduce are not considered apart from anything. The behavior that would
 help me is for non-reducing type family applications with constant
 arguments to be considered apart from everything except for themselves.
 Using the above example, `Foo 'True ~ Foo 'True` would typecheck, but `Foo
 'True ~ 'True` and `Foo 'True ~ Foo 'False` would both be rejected. In
 bulleted form, the requirement I listed are:

 * Non-reducing (or stuck)
 * Constant arguments (yes: `Foo 'True`, no: `Foo x`)

 I'm not sure if this is introduces inconsistencies or has any negative
 side effects.

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


More information about the ghc-tickets mailing list