Better error messages for do-notation
C Rodrigues [red5_2@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 ().
Trac metadata
Trac field | Value |
---|---|
Version | 6.10.4 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler (Type checker) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | red5_2@hotmail.com |
Operating system | |
Architecture |