Another common use is to ensure any exceptions hidden within lazy
fields of a data structure do not leak outside the scope of the
exception handler, or to force evaluation of a data structure in one
thread, before passing to another thread (preventing work moving to
the wrong threads).

Documentation

deepseq: fully evaluates the first argument, before returning the
second.

The name deepseq is used to illustrate the relationship to seq:
where seq is shallow in the sense that it only evaluates the top
level of its argument, deepseq traverses the entire data structure
evaluating it completely.

deepseq can be useful for forcing pending exceptions,
eradicating space leaks, or forcing lazy I/O to happen. It is
also useful in conjunction with parallel Strategies (see the
parallel package).

There is no guarantee about the ordering of evaluation. The
implementation may evaluate the components of the structure in
any order or in parallel. To impose an actual order on
evaluation, use pseq from Control.Parallel in the
parallel package.