Redundant constraints [GHC30606]
Flag: Wredundantconstraints
Enabled by:
This warning is emitted when a binding has a type signature which contains constraints that are unnecessary.
Examples
Redundant equality constraints
Error Message
Example.hs:5:6: warning: [Wredundantconstraints] [GHC30606]
Redundant constraint: b ~ a
In the type signature for:
f :: forall a b. (a ~ b, b ~ a) => a > b

5  f :: (a ~ b, b ~ a) => a > b
 ^^^^^^^^^^^^^^
Explanation
This example declares f
with the constraints (a ~ b, b ~ a)
(a
is
equal to b
and b
is equal to a
), but a ~ b
already implies
that b ~ a
(in other words, ~
is a symmetric relation).
We fix this by removing the constraint which is marked as redundant in the error
message, namely b ~ a
.
Example.hs
{# OPTIONS_GHC Wredundantconstraints #}
module Example where
f :: (a ~ b, b ~ a) => a > b
f x = x
{# OPTIONS_GHC Wredundantconstraints #}
module Example where
f :: (a ~ b) => a > b
f x = x
Redundant typeclass constraints
Error Message
Example.hs:5:6: warning: [Wredundantconstraints] [GHC30606]
Redundant constraint: Eq a
In the type signature for:
f :: forall a. (Eq a, Ord a) => a > a > Bool

5  f :: (Eq a, Ord a) => a > a > Bool
 ^^^^^^^^^^^^^
Explanation
This example declares f
with the constraints (Eq a, Ord a)
, but an Ord a
instance already implies an Eq a
instance, because Eq
is a superclass of
Ord
.
We fix this by removing the constraint which is marked as redundant in the error
message, namely Eq a
. Note that we can still use the (==)
method of Eq
in
the body of f
because of the aforementioned superclass constraint.
Example.hs
{# OPTIONS_GHC Wredundantconstraints #}
module Example where
f :: (Eq a, Ord a) => a > a > Bool
f x y = (x < y)  x == y
{# OPTIONS_GHC Wredundantconstraints #}
module Example where
f :: Ord a => a > a > Bool
f x y = (x < y)  x == y