#3613: Better error messages for do-notation
--------------------------------------+-------------------------------------
  Reporter:  simonpj                  |          Owner:                  
      Type:  bug                      |         Status:  new             
  Priority:  normal                   |      Milestone:                  
 Component:  Compiler (Type checker)  |        Version:  6.10.4          
  Severity:  normal                   |       Keywords:                  
Difficulty:  Unknown                  |       Testcase:                  
        Os:  Unknown/Multiple         |   Architecture:  Unknown/Multiple
--------------------------------------+-------------------------------------
 C Rodrigues [[email protected]] writes: In this example, fun1 and fun2
 are basically the same.  The type error is because they try to run an IO
 () together with a Maybe ().
 {{{
 > import Control.Monad
 >
 > foo :: Maybe ()
 > foo = return ()
 >
 > bar :: IO ()
 > bar = return ()
 >
 > fun1 = let fooThen m = foo>> m
 >        in fooThen (bar>> undefined)
 >
 > fun2 = let fooThen m = foo>> m
 >        in fooThen (do {bar; undefined})
 }}}
 With ghc 6.10.4, both functions attribute the error message to `bar'.
 However, the expected and inferred monads are swapped.
  * fun1 produces the error message:
 {{{
 Couldn't match expected type `Maybe a' against inferred type `IO ()'
 In the first argument of `(>>=)', namely `bar'
 }}}
  * fun2 produces the error message:
 {{{
 Couldn't match expected type `IO ()' against inferred type `Maybe ()'
 In a stmt of a 'do' expression: bar
 }}}
 It's confusing because 'bar' is inferred to have type Maybe (), even
 though it's explicitly declared to be an IO ().

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/3613>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to