| Copyright | (c) The University of Glasgow 2001-2009 |
|---|---|
| License | BSD-style (see the file LICENSE) |
| Maintainer | libraries@haskell.org |
| Stability | stable |
| Portability | portable |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Control.DeepSeq
Contents
Description
This module provides overloaded functions, such as deepseq and
rnf, 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
import Control.Exception (evaluate)
readFile' :: FilePath -> IO String
readFile' fn = do
h <- openFile fn ReadMode
s <- hGetContents h
evaluate (rnf s)
hClose h
return sNote: The example above should rather be written in terms of
bracket to ensure releasing file-descriptors in
a timely matter (see the description of force for an example).
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: deepseq-1.1.0.0
Synopsis
- class NFData a where
- deepseq :: NFData a => a -> b -> b
- force :: NFData a => a -> a
- ($!!) :: NFData a => (a -> b) -> a -> b
- (<$!!>) :: (Monad m, NFData b) => (a -> b) -> m a -> m b
- rwhnf :: a -> ()
- class NFData1 f where
- rnf1 :: (NFData1 f, NFData a) => f a -> ()
- class NFData2 p where
- rnf2 :: (NFData2 p, NFData a, NFData b) => p a b -> ()
NFData class
A class of types that can be fully evaluated.
Since: deepseq-1.1.0.0
Methods
rnf should reduce its argument to normal form (that is, fully
evaluate all sub-components), and then return '()'.
Generic NFData deriving
Starting with GHC 7.2, you can automatically derive instances
for types possessing a Generic instance.
Note: Generic1 can be auto-derived starting with GHC 7.4
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic, Generic1)
import Control.DeepSeq
data Foo a = Foo a String
deriving (Eq, Generic, Generic1)
instance NFData a => NFData (Foo a)
instance NFData1 Foo
data Colour = Red | Green | Blue
deriving Generic
instance NFData ColourStarting with GHC 7.10, the example above can be written more
concisely by enabling the new DeriveAnyClass extension:
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
import GHC.Generics (Generic)
import Control.DeepSeq
data Foo a = Foo a String
deriving (Eq, Generic, Generic1, NFData, NFData1)
data Colour = Red | Green | Blue
deriving (Generic, NFData)
Compatibility with previous deepseq versions
Prior to version 1.4.0.0, the default implementation of the rnf
method was defined as
rnfa =seqa ()
However, starting with deepseq-1.4.0.0, the default
implementation is based on DefaultSignatures allowing for
more accurate auto-derived NFData instances. If you need the
previously used exact default rnf method implementation
semantics, use
instance NFData Colour where rnf x = seq x ()
or alternatively
instance NFData Colour where rnf = rwhnf
or
{-# LANGUAGE BangPatterns #-}
instance NFData Colour where rnf !_ = ()rnf :: (Generic a, GNFData Zero (Rep a)) => a -> () Source #
rnf should reduce its argument to normal form (that is, fully
evaluate all sub-components), and then return '()'.
Generic NFData deriving
Starting with GHC 7.2, you can automatically derive instances
for types possessing a Generic instance.
Note: Generic1 can be auto-derived starting with GHC 7.4
{-# LANGUAGE DeriveGeneric #-}
import GHC.Generics (Generic, Generic1)
import Control.DeepSeq
data Foo a = Foo a String
deriving (Eq, Generic, Generic1)
instance NFData a => NFData (Foo a)
instance NFData1 Foo
data Colour = Red | Green | Blue
deriving Generic
instance NFData ColourStarting with GHC 7.10, the example above can be written more
concisely by enabling the new DeriveAnyClass extension:
{-# LANGUAGE DeriveGeneric, DeriveAnyClass #-}
import GHC.Generics (Generic)
import Control.DeepSeq
data Foo a = Foo a String
deriving (Eq, Generic, Generic1, NFData, NFData1)
data Colour = Red | Green | Blue
deriving (Generic, NFData)
Compatibility with previous deepseq versions
Prior to version 1.4.0.0, the default implementation of the rnf
method was defined as
rnfa =seqa ()
However, starting with deepseq-1.4.0.0, the default
implementation is based on DefaultSignatures allowing for
more accurate auto-derived NFData instances. If you need the
previously used exact default rnf method implementation
semantics, use
instance NFData Colour where rnf x = seq x ()
or alternatively
instance NFData Colour where rnf = rwhnf
or
{-# LANGUAGE BangPatterns #-}
instance NFData Colour where rnf !_ = ()Instances
| NFData Bool Source # | |
Defined in Control.DeepSeq | |
| NFData Char Source # | |
Defined in Control.DeepSeq | |
| NFData Double Source # | |
Defined in Control.DeepSeq | |
| NFData Float Source # | |
Defined in Control.DeepSeq | |
| NFData Int Source # | |
Defined in Control.DeepSeq | |
| NFData Int8 Source # | |
Defined in Control.DeepSeq | |
| NFData Int16 Source # | |
Defined in Control.DeepSeq | |
| NFData Int32 Source # | |
Defined in Control.DeepSeq | |
| NFData Int64 Source # | |
Defined in Control.DeepSeq | |
| NFData Integer Source # | |
Defined in Control.DeepSeq | |
| NFData Natural Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData Ordering Source # | |
Defined in Control.DeepSeq | |
| NFData Word Source # | |
Defined in Control.DeepSeq | |
| NFData Word8 Source # | |
Defined in Control.DeepSeq | |
| NFData Word16 Source # | |
Defined in Control.DeepSeq | |
| NFData Word32 Source # | |
Defined in Control.DeepSeq | |
| NFData Word64 Source # | |
Defined in Control.DeepSeq | |
| NFData CallStack Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData () Source # | |
Defined in Control.DeepSeq | |
| NFData TyCon Source # | NOTE: Prior to Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData Void Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData Unique Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData Version Source # | Since: deepseq-1.3.0.0 |
Defined in Control.DeepSeq | |
| NFData ThreadId Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData ExitCode Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData MaskingState Source # | Since: deepseq-1.4.4.0 |
Defined in Control.DeepSeq Methods rnf :: MaskingState -> () Source # | |
| NFData TypeRep Source # | NOTE: Prior to Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData All Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData Any Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CChar Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CSChar Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CUChar Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CShort Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CUShort Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CInt Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CUInt Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CLong Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CULong Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CLLong Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CULLong Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CBool Source # | Since: deepseq-1.4.3.0 |
Defined in Control.DeepSeq | |
| NFData CFloat Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CDouble Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CPtrdiff Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CSize Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CWchar Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CSigAtomic Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq Methods rnf :: CSigAtomic -> () Source # | |
| NFData CClock Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CTime Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CUSeconds Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CSUSeconds Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq Methods rnf :: CSUSeconds -> () Source # | |
| NFData CFile Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CFpos Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CJmpBuf Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CIntPtr Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CUIntPtr Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CIntMax Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData CUIntMax Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData Fingerprint Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq Methods rnf :: Fingerprint -> () Source # | |
| NFData SrcLoc Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData [a] Source # | |
Defined in Control.DeepSeq | |
| NFData a => NFData (Maybe a) Source # | |
Defined in Control.DeepSeq | |
| NFData a => NFData (Ratio a) Source # | |
Defined in Control.DeepSeq | |
| NFData (Ptr a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData (FunPtr a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Complex a) Source # | |
Defined in Control.DeepSeq | |
| NFData (Fixed a) Source # | Since: deepseq-1.3.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Min a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Max a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (First a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Last a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData m => NFData (WrappedMonoid m) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq Methods rnf :: WrappedMonoid m -> () Source # | |
| NFData a => NFData (Option a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData (StableName a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq Methods rnf :: StableName a -> () Source # | |
| NFData a => NFData (ZipList a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Identity a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData (IORef a) Source # | NOTE: Only strict in the reference and not the referenced value. Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (First a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Last a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Dual a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Sum a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Product a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (Down a) Source # | Since: deepseq-1.4.0.0 |
Defined in Control.DeepSeq | |
| NFData (MVar a) Source # | NOTE: Only strict in the reference and not the referenced value. Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData a => NFData (NonEmpty a) Source # | Since: deepseq-1.4.2.0 |
Defined in Control.DeepSeq | |
| NFData (a -> b) Source # | This instance is for convenience and consistency with Since: deepseq-1.3.0.0 |
Defined in Control.DeepSeq | |
| (NFData a, NFData b) => NFData (Either a b) Source # | |
Defined in Control.DeepSeq | |
| (NFData a, NFData b) => NFData (a, b) Source # | |
Defined in Control.DeepSeq | |
| (NFData a, NFData b) => NFData (Array a b) Source # | |
Defined in Control.DeepSeq Methods | |