Redundant constraints [GHC-30606]
Flag: -Wredundant-constraints
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: [-Wredundant-constraints] [GHC-30606]
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 -Wredundant-constraints #-}
module Example where
f :: (a ~ b, b ~ a) => a -> b
f x = x
{-# OPTIONS_GHC -Wredundant-constraints #-}
module Example where
f :: (a ~ b) => a -> b
f x = x
Redundant typeclass constraints
Error Message
Example.hs:5:6: warning: [-Wredundant-constraints] [GHC-30606]
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 -Wredundant-constraints #-}
module Example where
f :: (Eq a, Ord a) => a -> a -> Bool
f x y = (x < y) || x == y
{-# OPTIONS_GHC -Wredundant-constraints #-}
module Example where
f :: Ord a => a -> a -> Bool
f x y = (x < y) || x == y