-- 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. -- -- If you want to automatically derive NFData instances via the -- GHC.Generics facility, there is a companion package -- deepseq-generics which builds on top of this package. @package deepseq @version 1.3.0.2 -- | 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). -- -- Since: 1.1.0.0 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. -- -- Since: 1.1.0.0 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. -- -- Since: 1.2.0.0 ($!!) :: 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. -- -- Since: 1.2.0.0 force :: NFData a => a -> a -- | A class of types that can be fully evaluated. -- -- Since: 1.1.0.0 class NFData a where rnf a = a `seq` () rnf :: NFData a => a -> () instance [safe] (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 [safe] (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 [safe] (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData (a1, a2, a3, a4, a5, a6, a7) instance [safe] (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData (a1, a2, a3, a4, a5, a6) instance [safe] (NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5) instance [safe] (NFData a, NFData b, NFData c, NFData d) => NFData (a, b, c, d) instance [safe] (NFData a, NFData b, NFData c) => NFData (a, b, c) instance [safe] (NFData a, NFData b) => NFData (a, b) instance [safe] (Ix a, NFData a, NFData b) => NFData (Array a b) instance [safe] NFData a => NFData [a] instance [safe] NFData Version instance [safe] (NFData a, NFData b) => NFData (Either a b) instance [safe] NFData a => NFData (Maybe a) instance [safe] (RealFloat a, NFData a) => NFData (Complex a) instance [safe] (Integral a, NFData a) => NFData (Ratio a) instance [safe] NFData (a -> b) instance [safe] NFData (Fixed a) instance [safe] NFData Word64 instance [safe] NFData Word32 instance [safe] NFData Word16 instance [safe] NFData Word8 instance [safe] NFData Int64 instance [safe] NFData Int32 instance [safe] NFData Int16 instance [safe] NFData Int8 instance [safe] NFData () instance [safe] NFData Bool instance [safe] NFData Char instance [safe] NFData Double instance [safe] NFData Float instance [safe] NFData Integer instance [safe] NFData Word instance [safe] NFData Int