This package provides methods for partially (or fully) evaluating data
structures ("bounded deep evaluation").
More information is available on the project homepage.
There may be activity on this reddit discussion, where your comments are invited.
Quoting from the
deepseq package:
"Artificial forcing is often used for adding strictness to a program, e.g. in order to force pending exceptions, remove space leaks, or force lazy IO to happen. It is also useful in parallel programs, to ensure work does not migrate to the wrong thread."
Sometimes we don't want to, or cannot, force all the way, for instance
when dealing with potentially infinite values of coinductive types.
Also, bounded forcing bridges the theoretical axis between shallow seq
and full deepseq.
We provide two new classes NFDataN and NFDataP.
Instances of these provide bounded deep evaluation for arbitrary polytypic terms:
Instances of NFDataN and NFDataP can be automatically derived via Generics.SOP, backed by the GNFDataN and GNFDataP modules.
NFDataN can optionally be derived by the standard GHC.Generics facility (but not so for NFDataP).
Another approach is Seqable, which is similar to NFDataN,
but optimised for use as a dynamically-reconfigurable forcing harness
in the seqaid auto-instrumentation tool.
Recent developments supporting parallelisation control (in Pattern
and Seqable modules) may justify renaming this library to
something which encompasses both strictness and parallelism aspects.
NOTE: Versions >=0.6 are substantially different from the original (now deprecated) 0.5.* releases, particularly as regards NFDataP.