> 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 ().