# Redundant patterns [GHC-53633]

Flag: `-Woverlapping-patterns`
Enabled by default

In multi-equation definitions and case expressions, patterns are matched from top to bottom. This means that earlier patterns are tested before later patterns. If every value that a pattern could match has already been ruled out by earlier patterns, then it is unreachable, which typically indicates a bug or misunderstanding.

## Examples

Redundant catchall pattern

## Message

``````Overlapping.hs:6:1: warning: [GHC-53633] [-Woverlapping-patterns]
Pattern match is redundant
In an equation for ‘f’: f _ = ...
|
6 | f _ = False
| ^^^^^^^^^^^``````

## Explanation

In this case, all the patterns that can match a list were matched in the prior patterns, so the catch-all pattern in the last case will never be matched and is dead code.

`Overlapping.hs`
Before
``````module Overlapping where

f [] = True
f (_:_:xs) = f xs
f [_] = False
f _ = False
``````
After
``````module Overlapping where

f [] = True
f (_:_:xs) = f xs
f [_] = False
``````
Redundant constructor pattern

## Message

``````Overlapping.hs:5:1: warning: [GHC-53633] [-Woverlapping-patterns]
Pattern match is redundant
In an equation for ‘f’: f (Just _) = ...
|
5 | f (Just _) = False
| ^^^^^^^^^^^^^^^^^^``````

## Explanation

The definition of `f` contains two separate patterns that both match `(Just _)`. This usually indicates a bug, because the second one would be unreachable. This can be fixed by removing the redundant case, but it usually indicates that a change to the program was made quickly and demands more thought.

`Overlapping.hs`
Before
``````module Overlapping where

f :: Maybe a -> Bool
f (Just _) = True
f (Just _) = False
f _ = False

``````
After
``````module Overlapping where

f :: Maybe a -> Bool
f (Just _) = True
f _ = False
``````