
#11458: Terrible failure of type inference in visible type application -------------------------------------+------------------------------------- Reporter: simonpj | Owner: Type: bug | Status: new Priority: highest | Milestone: 8.0.1 Component: Compiler | Version: 7.10.3 (Type checker) | Keywords: | Operating System: Unknown/Multiple Architecture: | Type of failure: None/Unknown Unknown/Multiple | Test Case: | Blocked By: Blocking: | Related Tickets: Differential Rev(s): | Wiki Page: -------------------------------------+------------------------------------- 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!! -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11458 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler