-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Deep evaluation of data structures -- -- 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. @package deepseq @version 1.2.0.1 -- | 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 ---- -- deepseq differs from seq as it traverses data structures -- deeply, for example, seq will evaluate only to the first -- constructor in the list: -- --
-- > [1,2,undefined] `seq` 3 -- 3 ---- -- While 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). module Control.DeepSeq -- | 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. deepseq :: NFData a => a -> b -> b -- | the deep analogue of $!. In the expression f $!! x, -- x is fully evaluated before the function f is -- applied to it. ($!!) :: NFData a => (a -> b) -> a -> b -- | 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 -- force x itself is demanded, so essentially it turns shallow -- evaluation into deep evaluation. force :: NFData a => a -> a -- | A class of types that can be fully evaluated. class NFData a rnf :: NFData a => a -> () instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8, NFData a9) => NFData (a1, a2, a3, a4, a5, a6, a7, a8, a9) instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8) => NFData (a1, a2, a3, a4, a5, a6, a7, a8) instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData (a1, a2, a3, a4, a5, a6, a7) instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData (a1, a2, a3, a4, a5, a6) instance (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5) instance (NFData a, NFData b, NFData c, NFData d) => NFData (a, b, c, d) instance (NFData a, NFData b, NFData c) => NFData (a, b, c) instance (NFData a, NFData b) => NFData (a, b) instance (Ix a, NFData a, NFData b) => NFData (Array a b) instance NFData a => NFData [a] instance (NFData a, NFData b) => NFData (Either a b) instance NFData a => NFData (Maybe a) instance (RealFloat a, NFData a) => NFData (Complex a) instance (Integral a, NFData a) => NFData (Ratio a) instance NFData Word64 instance NFData Word32 instance NFData Word16 instance NFData Word8 instance NFData Int64 instance NFData Int32 instance NFData Int16 instance NFData Int8 instance NFData () instance NFData Bool instance NFData Char instance NFData Double instance NFData Float instance NFData Integer instance NFData Word instance NFData Int