This package provides methods for fully evaluating data structures ("deep evaluation"). Deep evaluation is often used for adding strictness to a program, e.g. in order to force pending exceptions, remove space leaks, or force lazy I/O to happen. It is also useful in parallel programs, to ensure pending work does not migrate to the wrong thread.
The primary use of this package is via the deepseq function, a "deep" version of seq. It is implemented on top of an NFData typeclass ("Normal Form Data", data structures with no unevaluated components) which defines strategies for fully evaluating different data types.
If you want to automatically derive NFData instances via the GHC.Generics facility, there is a companion package <http:hackage.haskell.orgpackagedeepseq-generics deepseq-generics> which builds on top of this package.
This package provides a deepseq function analogous to seq, except that it traverses the entire data structure, evaluating it fully, and not just up to head normal form.
Using lists as an example:
> > [1,2,undefined] `seq` 3
Whereas with deepseq:
> > [1,2,undefined] `deepseq` 3
> *** Exception: Prelude.undefined
Unlike the deepseq package, this implementation is based on the GHC.Generics framework as found in GHC >= 7.2, so that it can generate instances automatically for any datatype that has a Generic instance, without further code.
> data MyType = MyType String Int (Maybe Double)
> deriving Generic
> instance DeepSeq MyType
Changes in version 188.8.131.52:
* Vastly improved performance. As a consequence of these changes, the member function of the DeepSeq class is now rnf, instead of deepseq.
* New instances for functions, Ratio and Complex types.
Changes in version 184.108.40.206:
* Fix the U1 and V1 instances.
Changes in version 220.127.116.11:
* No functional changes, updated to correct the URLs of the repository and the issue tracker.