This module provides an overloaded function,
deepseq, for fully
evaluating data structures (that is, evaluating to "Normal Form").
A typical use is to prevent resource leaks in lazy IO programs, by forcing all characters from a file to be read. For example:
import System.IO import Control.DeepSeq main = do h <- openFile "f" ReadMode s <- hGetContents h s `deepseq` hClose h return s
> [1,2,undefined] `seq` 3 3
deepseq will force evaluation of all the list elements:
> [1,2,undefined] `deepseq` 3 *** Exception: Prelude.undefined
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).
deepseq: fully evaluates the first argument, before returning the
deepseq is used to illustrate the relationship to
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
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
pseq from Control.Parallel in the
the deep analogue of
$!. In the expression
f $!! x,
fully evaluated before the function
f is applied to it.
a variant of
deepseq that is useful in some circumstances:
force x = x `deepseq` x
force x fully evaluates
x, and then returns it. Note that
force x only performs evaluation when the value of
itself is demanded, so essentially it turns shallow evaluation into
A class of types that can be fully evaluated.
rnf should reduce its argument to normal form (that is, fully evaluate all sub-components), and then return '()'.
The default implementation of
rnf a = a `seq` ()
which may be convenient when defining instances for data types with no unevaluated fields (e.g. enumerations).