[GHC] #12863: Associated data families don't use superclasses when deriving instances

GHC ghc-devs at haskell.org
Mon Nov 21 12:14:45 UTC 2016


#12863: Associated data families don't use superclasses when deriving instances
-------------------------------------+-------------------------------------
           Reporter:  Iceland_jack   |             Owner:
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 {{{#!hs
 class Functor (TotalMap key) => Key key where
   data TotalMap key :: Type -> Type
   (¡) :: TotalMap key val -> key -> val
 }}}

 a constraint `Key key` entails a `Functor (TotalMap key)` constraint,
 using the notation of [https://hackage.haskell.org/package/constraints
 constraints]

 {{{#!hs
 prf1 :: Key key :- Functor (TotalMap key)
 prf1 = Sub Dict

 prf2 :: (Key key1, Key key2) :- (Functor (TotalMap key1), Functor
 (TotalMap key2))
 prf2 = prf1 *** prf1
 }}}

 Yet these proofs are not used in

 {{{#!hs
 -- tzLp.hs:28:89-95: error: …
 --     • No instance for (Functor (TotalMap key1))
 --         arising from the first field of ‘PairMap’
 --           (type ‘TotalMap key1 (TotalMap key2 val)’)
 --       Possible fix:
 --         use a standalone 'deriving instance' declaration,
 --           so you can specify the instance context yourself
 --     • When deriving the instance for (Functor (TotalMap (key1, key2)))
 -- Compilation failed.

 instance (Key key1, Key key2) => Key (key1, key2) where
   data TotalMap (key1, key2) val = PairMap (TotalMap key1 (TotalMap key2
 val))
     deriving Functor

   (¡) :: TotalMap (key1, key2) val -> ((key1, key2) -> val)
   PairMap keys ¡ (k1, k2) = keys ¡ k1 ¡ k2
 }}}

 I would expect it to work like
 {{{#!hs
 deriving instance (Key key1, Key key2) => Functor (TotalMap (key1, key2))
 }}}

 Same problem occurs with only a single constraint

 {{{#!hs
 -- tzLp.hs:33:14-20: error: …
 --     • No instance for (Functor (TotalMap key))
 --         arising from the first field of ‘Id’ (type ‘TotalMap key val’)
 --       Possible fix:
 --         use a standalone 'deriving instance' declaration,
 --           so you can specify the instance context yourself
 --     • When deriving the instance for (Functor
 --                                         (TotalMap (Identity key)))
 -- Compilation failed.

 instance Key key => Key (Identity key) where
   data TotalMap (Identity key) val = Id (TotalMap key val)
     deriving Functor
 }}}

 which should work like
 {{{#!hs
 deriving instance Key key                => Functor (TotalMap (Identity
 key))
 -- or
 deriving instance Functor (TotalMap key) => Functor (TotalMap (Identity
 key))
 }}}

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


More information about the ghc-tickets mailing list