Terrible failure of type inference in visible type application
-- 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!!
|Component||Compiler (Type checker)|