[GHC] #14179: "Conflicting family instance" error pretty prints data family instances poorly

GHC ghc-devs at haskell.org
Thu May 17 14:20:01 UTC 2018


#14179: "Conflicting family instance" error pretty prints data family instances
poorly
-------------------------------------+-------------------------------------
        Reporter:  RyanGlScott       |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler (Type    |              Version:  8.2.1
  checker)                           |
      Resolution:                    |             Keywords:  TypeFamilies
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  Poor/confusing    |  Unknown/Multiple
  error message                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by RyanGlScott):

 This is an interesting one. I think that the solution here might be to
 pretty-print conflicting data family instances slightly differently than
 conflicting data family instances, for two reasons:

 1. Type family instances are unique in that you have can have duplicate
 instances (see #14440). Thus, the pretty-printer //must// show their
 right-hand sides, because otherwise a user wouldn't know why they were
 conflicting.

    Data family instances, on the other hand, do not permit duplicates.
 These conflict, for instance:

    {{{#!hs
    data family Foo a
    data instance Foo a
    data instance Foo a
    }}}
 2. The right-hand side of a data family instance can be quite large if
 there are many constructors. We could address this with `pprDeeperList`,
 but it's of questionable utility, since
   a. We might be suppressing the constructors in which two data family
 instance differ, and
   b. Part 1. brings into question whether it's worth going through this
 trouble in the first place, since the constructors themselves aren't the
 thing which causes data family instances to conflict.

 In light of this, I would propose simply pretty-printing the data family
 instances without any constructors at all. In other words, for the
 programs in the original description, I would propose having these be the
 respective error messages:

 {{{
 Bug.hs:5:15: error:
     Conflicting family instance declarations:
       Fam Int -- Defined at Bug.hs:5:15
       Fam Int -- Defined at Bug.hs:6:15
   |
 5 | data instance Fam Int
   |               ^^^
 }}}
 {{{
 Bug.hs:6:15: error:
     Conflicting family instance declarations:
       Fam :: * -> * -- Defined at Bug.hs:6:15
       Fam :: * -> * -- Defined at Bug.hs:7:15
   |
 6 | data instance Fam :: * -> *
   |               ^^^
 }}}

 And for the program in comment:1:

 {{{
 Bug.hs:6:15: error:
     Conflicting family instance declarations:
       Fam [a] -- Defined at Bug.hs:6:15
       Fam [a] -- Defined at Bug.hs:9:15
   |
 6 | data instance Fam [a] where
   |               ^^^
 }}}

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


More information about the ghc-tickets mailing list