
On Fri, Oct 23, 2009 at 9:46 PM, Isaac Dupree
C Rodrigues wrote:
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 ().
Which message do you prefer? I couldn't tell which it was.
For myself, I never understood the difference between "expected" and "inferred": it works better for me to just think "there were at least two different ways that determined the 'type' of this expression, and the results contradicted each other, and here are two of those results. Now, dear user, go and look at your code to intuit *what* those ways of determining the type might have been" (or sometimes it's easier just to look for mistakes, ignoring the particular details of the error)
The expected type is what the context wants (it's *ex*ternal). The
inferred type is what the expression itself has (it's *in*ternal).
So inferring the type Maybe () for bar seems wrong. I'm guessing it's
a bug in the way do-expressions are handled. Note that this doesn't
happen if the bar is last.
Prelude> :t let fooThen m = foo >> m in fooThen (do undefined; bar)
<interactive>:1:51:
Couldn't match expected type `Maybe b'
against inferred type `IO ()'
In the expression: bar
In the first argument of `fooThen', namely
`(do undefined
bar)'
In the expression:
fooThen
(do undefined
bar)
Prelude> :t do foo; bar
<interactive>:1:8:
Couldn't match expected type `Maybe b'
against inferred type `IO ()'
In the expression: bar
In the expression:
do foo
bar
Prelude> :t do foo; bar; foo
<interactive>:1:8:
Couldn't match expected type `IO ()'
against inferred type `Maybe ()'
In a stmt of a 'do' expression: bar
In the expression:
do foo
bar
foo
--
Dave Menendez