[GHC] #956: improving error messages #1

GHC trac at galois.com
Sat Oct 21 03:44:54 EDT 2006


#956: improving error messages #1
------------------------------------------------------------+---------------
    Reporter:  Bulat Ziganshin <Bulat.Ziganshin at gmail.com>  |       Owner:         
        Type:  feature request                              |      Status:  new    
    Priority:  normal                                       |   Milestone:         
   Component:  Compiler                                     |     Version:  6.6    
    Severity:  normal                                       |    Keywords:         
  Difficulty:  Unknown                                      |    Testcase:         
Architecture:  Unknown                                      |          Os:  Unknown
------------------------------------------------------------+---------------
the following program
 {{{
 main = do putChar 'a'
           putChar
 }}}
 makes this error message::
 {{{
     Couldn't match expected type `IO' against inferred type `(->) Char'
     Probable cause: `putChar' is applied to too few arguments
     In the expression: putChar
 }}}

 while the 'probable cause' is very helpful, the error message by
 itself is hard to understand for novices. i propose in these cases to
 work against known value types. in this case, we know that 'putChar'
 has type 'Char -> IO ()' and GHC may report smth like this:

 {{{
 'putChar': expression of type 'Char -> IO ()' used in context that
 requires expression of 'IO ()' type
 Probably, you've omitted parameter of type 'Char' to this expression
 }}}

 comparing this with existing message shows that may be improved:

 1) for me, it's still hard to understand what is "expected" and
 "inferred" means. i guess that for true beginners it's even harder.
 i prefer to see something more English and less Mathematic - it will
 be very helpful

 2) instead of obscure 'IO' and `(->) Char' types, i strongly prefer to
 see more pragmatic 'IO ()' and 'Char -> IO ()' ones

 3) 'Probable cause' may be more pleasant by telling position and type
 of skipped argument(s)



 my second example is almost the same :)

 {{{
 main = do putChar
           putChar 'a'
 }}}
 in this case error message is even worser:

 {{{
     Couldn't match expected type `(->) Char' against inferred type `IO'
     Probable cause: `putChar' is applied to too many arguments
     In the expression: putChar 'a'
 }}}

 afaiu, here GHC thought that putChar should have 'IO ()' type. or, it may
 think that operations in this monad has type 'Char -> IO ()'. anyway, it
 will be great if GHC will know that operations in monad usually has type
 'IO a' or 'm a' and try to use this heuristic when dealing with such
 errors (different types of statements in 'do' block)

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


More information about the Glasgow-haskell-bugs mailing list