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
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).