Type checker's expected and inferred types

C Rodrigues red5_2 at hotmail.com
Fri Oct 23 21:12:14 EDT 2009

I came across a type error that misled me for quite a while, because the expected and inferred types were backwards (from my point of view).  A simplified example is below.  Can someone explain how GHC's type checker creates the error message?
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 (). 		 	   		  
New Windows 7: Find the right PC for you. Learn more.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/glasgow-haskell-users/attachments/20091023/8a6f74b9/attachment.html

More information about the Glasgow-haskell-users mailing list