Type checker's expected and inferred types (reformatted)

C Rodrigues red5_2 at hotmail.com
Fri Oct 23 21:30:26 EDT 2009

(Some formatting was apparently lost en route.  Trying again with extra newlines.)
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 ().
Windows 7: Simplify your PC. Learn more.

More information about the Glasgow-haskell-users mailing list