[GHC] #8390: regression in handling of type variables in constraints on instances which do not appear in the instance head

GHC ghc-devs
Thu Oct 3 16:36:14 UTC 2013


#8390: regression in handling of type variables in constraints on instances which
do not appear in the instance head
----------------------------------------------+----------------------------
        Reporter:  aavogt                     |            Owner:
            Type:  bug                        |           Status:  new
        Priority:  normal                     |        Milestone:
       Component:  Compiler                   |          Version:  7.7
      Resolution:                             |         Keywords:
Operating System:  Unknown/Multiple           |     Architecture:
 Type of failure:  GHC rejects valid program  |  Unknown/Multiple
       Test Case:                             |       Difficulty:  Unknown
        Blocking:                             |       Blocked By:
                                              |  Related Tickets:
----------------------------------------------+----------------------------

Comment (by simonpj):

 Consider:
 {{{
 f :: Num a => Int -> Int
 f = blah

 instance Num a => C Int where blah
 }}}
 Both cases, calling `f` or using the instance, will give rise to an
 ambiguous constraint `Num a`.  So both are rejected in the same way.

 But functions with an ambiguous times may ''sometimes'' be callable.  Eg
 {{{
 class C a b where ...

 f :: C a b => a -> Int
 f = blah

 instance C a b => Eq [a] where blah
 }}}
 The type of `f` is ambiguous, in the sense that if we said
 {{{
 g :: C a b => a -> Int   -- Identical
 g = f
 }}}
 type checking would fail even.  But at ''certain'' types, typechecking
 might succeed.  Example
 {{{
 instance C Char b where blah
 foo = f 'x'
 }}}
 The `-XAllowAmbiguousTypes` flag therefore tells GHC to accept f's type
 even if it's ambiguous.

 Thus, GHC's definition of "ambiguous" is "over-eager" in the sense that
 the function ''can'' be called at some types, although perhaps not at
 others.  Hence the flag.

 I don't know a less-eager-but-still-useful definition.

 Certainly, I got lots of Trac tickets before saying "I had a definition
 f=e; I got ghci to tell me its type; I pasted in that type as a type
 signature for f, and it didn't typecheck".  That was because the inferred
 type was ambiguous.

 Same with instance decls.  The error message now says
 {{{
 T8390.hs:14:10:
     Could not deduce (Fun g a b0)
       arising from the ambiguity check for an instance declaration
     from the context (Fun f b c, Fun g a b)
       bound by an instance declaration:
                  (Fun f b c, Fun g a b) => Fun (Compose f g) a c
       at T8390.hs:14:10-56
     The type variable ?b0? is ambiguous
     In the ambiguity check for:
       forall f g a c b. (Fun f b c, Fun g a b) => Fun (Compose f g) a c
     To defer the ambiguity check to use sites, enable AllowAmbiguousTypes
     In the instance declaration for ?Fun (Compose f g) a c?
 }}}
 and adding `-XAllowAmbiguousTypes` makes it go through.

 OK?

 Simon

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



More information about the ghc-tickets mailing list