[GHC] #14860: QuantifiedConstraints: Can't quantify constraint involving type family

GHC ghc-devs at haskell.org
Tue Nov 20 08:16:18 UTC 2018


#14860: QuantifiedConstraints: Can't quantify constraint involving type family
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler (Type    |              Version:  8.5
  checker)                           |             Keywords:
      Resolution:  wontfix           |  QuantifiedConstraints
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by edsko):

 This is all rather unfortunate. I'd like to be able to write

 {{{#!hs
 class (forall b. Show b => Show (T a b)) => C a where
   type family T a :: * -> *

 data D a = MkD (T a Int)

 deriving instance C a => Show (D a)
 }}}

 but cannot. @simonpj writes:

 > "Remember, a quantified constraint is a bit like a local instance
 declaration. We don't allow `instance C (F a) where ...` where F is a type
 function; and no more should we allow `forall a. Show (Apply f a)` as a
 quantified constraint".

 But then why can I write

 {{{#!hs
 class (Show (T a)) => C a where
   type family T a :: *

 data D a = MkD (T a)

 -- Could not deduce (Show (T a Int))
 --   arising from a use of ‘showsPrec’
 deriving instance C a => Show (D a)
 }}}

 Shouldn't by the same reasoning this fail to work also? (Please don't make
 it fail though! :-D ) (Yes, it's not quantified, but it's "trivially
 quantified"; it feels strange to me to allow one but not the other.)

 Note that for this kind of use case there is no easy workaround; as
 https://ghc.haskell.org/trac/ghc/ticket/15347#comment:15 points out, it
 involves adding new type variables to the class, kind of defeating the
 purpose of having type families in the first place. (Not to mention that I
 have a ''bunch'' of these type families in my real example.)

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


More information about the ghc-tickets mailing list