[GHC] #3613: Better error messages for do-notation
GHC
trac at galois.com
Tue Oct 27 05:25:41 EDT 2009
#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 [red5_2 at hotmail.com] 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
More information about the Glasgow-haskell-bugs
mailing list