[GHC] #4815: Instance constraints should be used when deriving on associated data types

GHC cvs-ghc at haskell.org
Fri Dec 3 16:34:23 CET 2010


#4815: Instance constraints should be used when deriving on associated data types
---------------------------------+------------------------------------------
    Reporter:  batterseapower    |       Owner:              
        Type:  feature request   |      Status:  new         
    Priority:  normal            |   Component:  Compiler    
     Version:  6.12.3            |    Keywords:              
    Testcase:                    |   Blockedby:              
          Os:  Unknown/Multiple  |    Blocking:              
Architecture:  Unknown/Multiple  |     Failure:  None/Unknown
---------------------------------+------------------------------------------
 Consider this program:

 {{{
 {-# LANGUAGE TypeFamilies, FlexibleContexts #-}

 class Eq (Associated a) => Foo a where
     data Associated a

 instance Foo a => Foo (Maybe a) where
     data Associated (Maybe a) = AssociatedMaybe (Associated a)
                               deriving (Eq)
 }}}

 This does not compile, giving this error message:

 {{{

 /Users/mbolingbroke/Junk/Repro.hs:9:40:
     No instance for (Eq (Associated a))
       arising from the 'deriving' clause of a data type declaration
                    at /Users/mbolingbroke/Junk/Repro.hs:9:40-41
     Possible fix:
       add an instance declaration for (Eq (Associated a))
       or use a standalone 'deriving instance' declaration instead,
          so you can specify the instance context yourself
     When deriving the instance for (Eq (Associated (Maybe a)))
 }}}

 However, this is surprising because I clearly state that a is Foo, and
 hence (Associated a) has an Eq instance by the superclass constraint on
 Foo.

 If I point this out explicitly using standalone deriving it works:

 {{{
 {-# LANGUAGE TypeFamilies, FlexibleContexts #-}
 {-# LANGUAGE StandaloneDeriving, FlexibleInstances #-}

 class Eq (Associated a) => Foo a where
     data Associated a

 instance Foo a => Foo (Maybe a) where
     data Associated (Maybe a) = AssociatedMaybe (Associated a)
 --                              deriving (Eq)

 deriving instance Foo a => Eq (Associated (Maybe a))
 }}}

 So I think the default behaviour for "deriving" on an associated data
 family should be to include the constraints from the enclosing instance.
 For now the workaround is just to use standalone deriving.

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



More information about the Glasgow-haskell-bugs mailing list