[GHC] #8450: can't match type Bool with (), but shouldn't have to

GHC ghc-devs at haskell.org
Wed Oct 16 23:22:33 UTC 2013


#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


More information about the ghc-tickets mailing list