[GHC] #9033: Type error suppresses defaulting, causes spurious errors

GHC ghc-devs at haskell.org
Thu Apr 24 14:17:40 UTC 2014


#9033: Type error suppresses defaulting, causes spurious errors
-----------------------------------------+---------------------------------
       Reporter:  jun0                   |             Owner:
           Type:  bug                    |            Status:  new
       Priority:  normal                 |         Milestone:
      Component:  Compiler               |           Version:  7.8.2
       Keywords:  defaulting, ambiguous  |  Operating System:
   Architecture:  Unknown/Multiple       |  Unknown/Multiple
     Difficulty:  Unknown                |   Type of failure:  None/Unknown
     Blocked By:                         |         Test Case:
Related Tickets:                         |          Blocking:
-----------------------------------------+---------------------------------
 I have a strong feeling this must have been reported already but I can't
 find a ticket for it, so here goes.

 If a source file contains a type error, like
 {{{#!haskell
 bad :: Bool
 bad = ()
 }}}
 then GHC seems to turn off defaulting for ambiguous types in the remainder
 of the file.  So if the same file contains for instance
 {{{#!haskell
 square :: Integral i => i -> i
 square x = x^2
 }}}
 then GHC reports another type error at the ^2:
 {{{
 test.hs:4:7:
     Couldn't match expected type ‘Bool’ with actual type ‘()’
     In the expression: ()
     In an equation for ‘bad’: bad = ()

 test.hs:7:13:
     Could not deduce (Integral b0) arising from a use of ‘^’
     from the context (Integral i)
       bound by the type signature for square :: Integral i => i -> i
       at test.hs:6:11-30
     The type variable ‘b0’ is ambiguous
     Note: there are several potential instances:
       instance Integral Int -- Defined in ‘GHC.Real’
       instance Integral Integer -- Defined in ‘GHC.Real’
       instance Integral GHC.Types.Word -- Defined in ‘GHC.Real’
     In the expression: x ^ 2
     In an equation for ‘square’: square x = x ^ 2

 test.hs:7:14:
     Could not deduce (Num b0) arising from the literal ‘2’
     from the context (Integral i)
       bound by the type signature for square :: Integral i => i -> i
       at test.hs:6:11-30
     The type variable ‘b0’ is ambiguous
     Note: there are several potential instances:
       instance Num Double -- Defined in ‘GHC.Float’
       instance Num Float -- Defined in ‘GHC.Float’
       instance Integral a => Num (GHC.Real.Ratio a)
         -- Defined in ‘GHC.Real’
       ...plus three others
     In the second argument of ‘(^)’, namely ‘2’
     In the expression: x ^ 2
     In an equation for ‘square’: square x = x ^ 2
 }}}
 The first error is a legitimate type mismatch and it's all fine, but the
 other two should be resolved with default instance selection -- and it is,
 once the type error in `bad` is fixed.  For example, rewriting `bad` to
 {{{#!haskell
 bad :: ()
 bad = ()
 }}}
 makes *all* errors go away, including the ones on `square`.

 Default instance selection seems to be turned back on when square is made
 monomorphic, like
 {{{#!haskell
 squareMono :: Int -> Int
 squareMono x = x^2
 }}}
 Note that the type of x is being fixed, not the 2 that GHC complains about
 in square.  The effect of this is that in a file with a large number of
 `^2`, `^3`, and such, the error message pointing to the real type error is
 drowned in all the "could not deduce" messages.

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


More information about the ghc-tickets mailing list