[GHC] #14237: -Wredundant-constraints incorrectly warns about required type equality constraints in default signatures

GHC ghc-devs at haskell.org
Thu Sep 14 23:50:44 UTC 2017


#14237: -Wredundant-constraints incorrectly warns about required type equality
constraints in default signatures
-------------------------------------+-------------------------------------
           Reporter:  lexi.lambda    |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.2.1
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Incorrect
  Unknown/Multiple                   |  error/warning at compile-time
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 GHC emits a warning about the following function:

 {{{#!hs
 f :: (Integer ~ a) => a -> Integer
 f = (+ 1)
 }}}
 {{{
 /private/tmp/redundant-default-
 constraint/src/RedundantDefaultConstraints.hs:14:1: warning: [-Wredundant-
 constraints]
     • Redundant constraint: Integer ~ a
     • In the type signature for:
            f :: forall a. Integer ~ a => a -> Integer
    |
 14 | f :: Integer ~ a => a -> Integer
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 }}}

 This is understandable (though the error message could perhaps be better)
 because the equality is pointless. It would be better to just rewrite the
 type signature as `Integer -> Integer`.

 However, this becomes problematic when combined with `DefaultSignatures`.
 GHC ''also'' emits a warning for the following program:

 {{{#!hs
 class Monad m => MonadFoo m where
   foo :: m ()

   default foo :: (MonadFoo m', MonadTrans t, m ~ t m') => m ()
   foo = lift foo
 }}}
 {{{
 /private/tmp/redundant-default-
 constraint/src/RedundantDefaultConstraints.hs:8:18: warning: [-Wredundant-
 constraints]
     • Redundant constraint: m ~ t m'
     • In the type signature for:
            foo :: forall (m' :: * -> *) (t :: (* -> *) -> * -> *).
                   (MonadFoo m', MonadTrans t, m ~ t m') =>
                   m ()
   |
 8 |   default foo :: (MonadFoo m', MonadTrans t, m ~ t m') => m ()
   |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 }}}

 This is wrong, because the constraint here is necessary. The type equality
 cannot be “inlined” into the type, since #12918 made that illegal. The
 constraint cannot be removed entirely, since then the program would fail
 to typecheck. Therefore, GHC should not produce an error in this case.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14237>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list