[GHC] #10733: Improving the error message for type variable ambiguity

GHC ghc-devs at haskell.org
Tue Aug 4 01:02:14 UTC 2015


#10733: Improving the error message for type variable ambiguity
-------------------------------------+-------------------------------------
              Reporter:  Rufflewind  |             Owner:
                  Type:  feature     |            Status:  new
  request                            |
              Priority:  normal      |         Milestone:
             Component:  Compiler    |           Version:  7.10.2
              Keywords:              |  Operating System:  Unknown/Multiple
          Architecture:              |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
             Test Case:              |        Blocked By:
              Blocking:              |   Related Tickets:
Differential Revisions:              |
-------------------------------------+-------------------------------------
 This is a summary of a [https://mail.haskell.org/pipermail/ghc-
 devs/2015-August/009522.html discussion on ghc-devs].

 The current message when a type variable is ambiguous could use a little
 rewording to improve its friendliness towards the user.  Currently, it
 looks like this:

 {{{
 No instance for (Foldable t0) arising from a use of ‘elem’
 The type variable ‘t0’ is ambiguous
 Relevant bindings include valid :: t0 Char (bound at …)
 Note: there are several potential instances:
   instance Foldable (Either a) -- Defined in ‘Data.Foldable’
   instance Foldable Data.Proxy.Proxy -- Defined in ‘Data.Foldable’
   instance GHC.Arr.Ix i => Foldable (GHC.Arr.Array i)
     -- Defined in ‘Data.Foldable’
   ...plus three others
 }}}

 The focus seems to be on "No instance", which, while technically correct,
 does not usually lead to the correct solution of the problem.  In
 particular, the "type variable is ambiguous" does not appear until the 2nd
 or 3rd line, making it easy to miss, which may lead to confusion with
 other kinds of "No instance" errors that have a similar leading sentence.

 There are two ways to fix this error usually:

 * By defining `instance Foldable t0`, but this is rarely what the user
 wants.

 * By fixing the ambiguity using a type annotation.

 Given that the latter seems to be a more likely cause, it may help if the
 error message were rewritten to prioritize that, while also leaving the
 first solution open if the user really knows what they are doing.

 Therefore, it is suggested that the message should reword in a way similar
 to this:

 {{{
 Ambiguous type variable ‘t0’ arising from a use of ‘elem’
 caused by the lack of an instance ‘(Foldable t0)’
 Relevant bindings include valid :: t0 Char (bound at …)
 Either use a type annotation to specify what ‘t0’ should be
 based on these potential instance(s):
   instance Foldable (Either a) -- Defined in ‘Data.Foldable’
   instance Foldable Data.Proxy.Proxy -- Defined in ‘Data.Foldable’
   instance GHC.Arr.Ix i => Foldable (GHC.Arr.Array i)
   ... plus three others and possibly more from other modules that
       the compiler has not yet encountered
 or define the required instance ‘(Foldable t0)’
 }}}

 which puts the emphasis on "ambiguous type variable" in the first few
 words while also outlining the possible solutions for the user and
 reminding them of the open-world assumption.

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


More information about the ghc-tickets mailing list