[GHC] #11451: Inconsistent warnings for unused binders

GHC ghc-devs at haskell.org
Tue Jan 19 19:03:02 UTC 2016


#11451: Inconsistent warnings for unused binders
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  7.10.3
      Resolution:                    |             Keywords:
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 ekmett):

 That can be used to work around this particular concern somewhat, though
 the mangled names will show up in haddocks and :t and the like, making
 things a lot noisier. In contrast, the stuff that happens at the value
 level doesn't make it into the documentation.

 I'm much more concerned by the mention that we may want to start applying
 this reasoning to instances, however.

 > Currently GHC does not warn about type variables bound in the instance
 head but unused in the where part. Fixing that might be a good idea [snip]

 There one can argue that those type variables are serving multiple roles.

 Consider that

 {{{
 instance Foo (a,a)
 }}}

 is quite different than

 {{{
 instance a ~ b => Foo (a,b)
 }}}

 The fact that there are multiple type variables is actually providing
 information about what is required to unify with what. The instance head
 interacts with 'itself' in that way. The relationships between the type
 variables that show up in the signature matter, even if they never appear
 in the body itself.

 At the value level patterns are forced to be linear, multiple uses aren't
 a concern, but at least in instance heads non-linear patterns arise rather
 frequently, so that may make it more palatable to not try to shoehorn
 instance heads into this same uniform handling.

 Also, if dealing with the fact that every type family is going to start
 setting off alarm bells is bad, forcing a change on probably 95% of the
 instances out there is likely to cause panic in the streets. ;)

 It'd also show up in mangled form throughout the haddocks, creating an
 uncomfortable tension between seeing the warning and providing pretty
 documentation. That is less of a concern for type instances and class
 associated types, but mostly just because there are a lot fewer of those.

 My primary concern is that it isn't obvious to me that even a single user
 error in the wild will actually be caught by the change, in exchange for
 all of this mangling. I'm concerned that it seems like a lot of make-work
 for users and the end state isn't really any nicer than the one we started
 in, hence my unease above. We make things a little more strict for library
 authors, but make things uglier for users.

 I'd personally be okay with changing all my code around to work with these
 type families and type synonym warnings.

 That said, doing the same with instances seems like it would be a pretty
 radical departure from existing practice, and I think once we start doing
 this to `type`, we'll start eyeballing `data` and `newtype` next, and I
 can see a lot of code and documentation getting uglier with little upside
 and it getting worse the farther down that road we travel.

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


More information about the ghc-tickets mailing list