
#8450: can't match type Bool with (), but shouldn't have to ------------------------------------+------------------------------------- Reporter: dmwit | Owner: Type: feature request | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.6.3 Keywords: | Operating System: Unknown/Multiple Architecture: Unknown/Multiple | Type of failure: None/Unknown Difficulty: Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | ------------------------------------+------------------------------------- The following (definitely type-incorrect) file: {{{ {-# LANGUAGE ScopedTypeVariables #-} runEffect :: Either Bool r -> r runEffect = undefined run :: forall a. a run = runEffect $ (undefined :: Either a ()) }}} produces the following error: {{{ test.hs:7:7: Couldn't match type `Bool' with `()' Expected type: a Actual type: () In the expression: runEffect $ (undefined :: Either a ()) In an equation for `run': run = runEffect $ (undefined :: Either a ()) }}} This is strange because one of the two types it claims it can't unify (Bool) doesn't appear in either the expected or actual type. Note that removing the ($) gets a different error message that makes it a bit more clear what's going on: {{{ test.hs:7:18: Couldn't match type `Bool' with `()' Expected type: Either Bool a Actual type: Either a () In the first argument of `runEffect', namely `(undefined :: Either a ())' In the expression: runEffect (undefined :: Either a ()) In an equation for `run': run = runEffect (undefined :: Either a ()) }}} So it seems it's trying to unify Bool and () because it's unifying both a with Bool and a with (); however, the usual comments about rigid type variables aren't there, which makes even this error message a bit confusing. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8450 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler