The Eq class defines equality (==) and inequality (/=). All the basic datatypes
exported by the Prelude are instances of Eq, and Eq may be derived for any
datatype whose constituents are also instances of Eq.

The Haskell Report defines no laws for Eq. However, == is customarily expected
to implement an equivalence relationship where two values comparing equal are
indistinguishable by "public" functions, with a "public" function being one not
allowing to see implementation details. For example, for a type representing
non-normalised natural numbers modulo 100, a "public" function doesn't make the
difference between 1 and 201. It is expected to have the following properties:

  Reflexivity:
   x == x = True
  
  Symmetry:
   x == y = y == x
  
  Transitivity:
   if x == y && y == z = True, then x == z = True
  
  Substitutivity:
   if x == y = True and f is a "public" function
   whose return type is an instance of Eq, then f x == f y = True
  
  Negation:
   x /= y = not (x == y)

Minimal complete definition: either == or /=.