Terrible failure of type inference in visible type application
Consider
-- optIntArg :: (Maybe Int -> t2) -> (t2,t2)
optIntArg f = (f Nothing, f (Just True))
This is rejected (by HEAD)
T11379a.hs:5:30: error:
* Couldn't match type `a' with `Bool'
`a' is a rigid type variable bound by
a type expected by the context:
forall a. Maybe a
at T11379a.hs:5:30
Expected type: forall a. Maybe a
Actual type: Maybe Bool
* In the first argument of `f', namely `(Just True)'
In the expression: f (Just True)
In the expression: (f Nothing, f (Just True))
but if you put the tuple components the other way round, it works fine
optIntArg f = (f (Just True), f Nothing)
Adding the commented-out signature also makes it work fine.
I'm almost certain that this is caused by visible type application; perhaps Nothing
gets delayed instantiation, and then f
's type becomes forall a. Maybe a
. Utterly bogus.
I suspect it'll be fixed by Richards ReturnTv
work, but let's make sure it is. We can't release this!!
Trac metadata
Trac field | Value |
---|---|
Version | 7.10.3 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | highest |
Resolution | Unresolved |
Component | Compiler (Type checker) |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |