Skip to content

Report class constraints when reporting type errors.

Summary

GHC does not report classes when it reports type errors, making it hard to fix bugs.

Steps to reproduce

Take a function like e.g. Hedgehog's Hedgehog.Gen.sample

sample :: MonadIO m => Gen a -> m a

write

sample :: ()

You will get an error such as:

    • Couldn't match expected type ‘()’      
                  with actual type ‘Gen a0 -> m0 a0’
    • Probable cause: ‘Gen.sample’ is applied to too few arguments
      In the expression: Gen.sample :: ()    
      In an equation for ‘x’: x = Gen.sample :: ()
      In the expression:                     
        do putStrLn "Hello, Test!"           
           let x = ...                       
           return ()                         
   |                                         
16 |   let x = Gen.sample :: ()              
   |           ^^^^^^^^^^                    

Expected behavior

I'd like to have GHC report that m0 above is a MonadIO. That would have saved me a lot of trouble by tipping me off that it's just something I can use at the top level of the do block in main.

I understand the code that had an error is a little funny, it's just a minimal case I could come up with to report here that is still somewhat practical.

I feel like I've encountered this many times before, but it only now occurred to me that it would be much better if GHC actually reported the classes.

Environment

  • GHC version used: 8.6.3
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information