-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Deep evaluation of data structures -- @package deepseq @version 1.4.1.0 -- | 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. -- -- force can be conveniently used in combination with -- ViewPatterns: -- --
-- {-# LANGUAGE BangPatterns, ViewPatterns #-}
-- import Control.DeepSeq
--
-- someFun :: ComplexData -> SomeResult
-- someFun (force -> !arg) = {- 'arg' will be fully evaluated -}
--
--
-- Another useful application is to combine force with
-- evaluate in order to force deep evaluation relative to other
-- IO operations:
--
--
-- import Control.Exception (evaluate)
-- import Control.DeepSeq
--
-- main = do
-- result <- evaluate $ force $ pureComputation
-- {- 'result' will be fully evaluated at this point -}
-- return ()
--
--
-- 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 = grnf . from
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] NFData CJmpBuf
instance [safe] NFData CFpos
instance [safe] NFData CFile
instance [safe] NFData CDouble
instance [safe] NFData CFloat
instance [safe] NFData CSUSeconds
instance [safe] NFData CUSeconds
instance [safe] NFData CTime
instance [safe] NFData CClock
instance [safe] NFData CUIntMax
instance [safe] NFData CIntMax
instance [safe] NFData CUIntPtr
instance [safe] NFData CIntPtr
instance [safe] NFData CULLong
instance [safe] NFData CLLong
instance [safe] NFData CSigAtomic
instance [safe] NFData CWchar
instance [safe] NFData CSize
instance [safe] NFData CPtrdiff
instance [safe] NFData CULong
instance [safe] NFData CLong
instance [safe] NFData CUInt
instance [safe] NFData CInt
instance [safe] NFData CUShort
instance [safe] NFData CShort
instance [safe] NFData CUChar
instance [safe] NFData CSChar
instance [safe] NFData CChar
instance [safe] NFData Fingerprint
instance [safe] NFData Unique
instance [safe] NFData ThreadId
instance [safe] NFData (StableName a)
instance [safe] NFData a => NFData (Product a)
instance [safe] NFData a => NFData (Sum a)
instance [safe] NFData All
instance [safe] NFData Any
instance [safe] NFData a => NFData (Last a)
instance [safe] NFData a => NFData (First a)
instance [safe] NFData a => NFData (Dual a)
instance [safe] NFData a => NFData (Down a)
instance [safe] (Ix a, NFData a, NFData b) => NFData (Array a b)
instance [safe] NFData a => NFData (Const a b)
instance [safe] NFData a => NFData (ZipList a)
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] 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 (Proxy 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
instance [safe] (GNFData a, GNFData b) => GNFData (a :+: b)
instance [safe] (GNFData a, GNFData b) => GNFData (a :*: b)
instance [safe] GNFData a => GNFData (M1 i c a)
instance [safe] NFData a => GNFData (K1 i a)
instance [safe] GNFData U1
instance [safe] GNFData V1