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 |