#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