Control.DeepSeq

deepseq-1.4.4.0: Deep evaluation of data structures

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

- `NFData` class
- Helper functions
- Liftings of the `NFData` class
  - For unary constructors
  - For binary constructors

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 s

Note: 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
  - rnf :: a -> ()
- 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
  - liftRnf :: (a -> ()) -> f a -> ()
- rnf1 :: (NFData1 f, NFData a) => f a -> ()
- class NFData2 p where
  - liftRnf2 :: (a -> ()) -> (b -> ()) -> p a b -> ()
- rnf2 :: (NFData2 p, NFData a, NFData b) => p a b -> ()

# `NFData` class

class NFData a where #

A class of types that can be fully evaluated.

Since: deepseq-1.1.0.0

Minimal complete definition

Nothing

Methods

rnf :: a -> () #

`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 Colour

Starting 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

    rnf a = seq a ()

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 -> () #

`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 Colour

Starting 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

    rnf a = seq a ()

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 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Bool -> () #
NFData Char # |
Instance details Defined in Control.DeepSeq Methods rnf :: Char -> () #
NFData Double # |
Instance details Defined in Control.DeepSeq Methods rnf :: Double -> () #
NFData Float # |
Instance details Defined in Control.DeepSeq Methods rnf :: Float -> () #
NFData Int # |
Instance details Defined in Control.DeepSeq Methods rnf :: Int -> () #
NFData Int8 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Int8 -> () #
NFData Int16 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Int16 -> () #
NFData Int32 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Int32 -> () #
NFData Int64 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Int64 -> () #
NFData Integer # |
Instance details Defined in Control.DeepSeq Methods rnf :: Integer -> () #
NFData Natural # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Natural -> () #
NFData Ordering # |
Instance details Defined in Control.DeepSeq Methods rnf :: Ordering -> () #
NFData Word # |
Instance details Defined in Control.DeepSeq Methods rnf :: Word -> () #
NFData Word8 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Word8 -> () #
NFData Word16 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Word16 -> () #
NFData Word32 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Word32 -> () #
NFData Word64 # |
Instance details Defined in Control.DeepSeq Methods rnf :: Word64 -> () #
NFData CallStack # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: CallStack -> () #
NFData () # |
Instance details Defined in Control.DeepSeq Methods rnf :: () -> () #
NFData TyCon # | NOTE: Prior to `deepseq-1.4.4.0` this instance was only defined for `base-4.8.0.0` and later. Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: TyCon -> () #
NFData Void # | Defined as ``rnf` = `absurd``. Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Void -> () #
NFData Unique # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Unique -> () #
NFData Version # | Since: deepseq-1.3.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Version -> () #
NFData ThreadId # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: ThreadId -> () #
NFData ExitCode # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: ExitCode -> () #
NFData MaskingState # | Since: deepseq-1.4.4.0
Instance details Defined in Control.DeepSeq Methods rnf :: MaskingState -> () #
NFData TypeRep # | NOTE: Prior to `deepseq-1.4.4.0` this instance was only defined for `base-4.8.0.0` and later. Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: TypeRep -> () #
NFData All # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: All -> () #
NFData Any # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Any -> () #
NFData CChar # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CChar -> () #
NFData CSChar # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CSChar -> () #
NFData CUChar # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CUChar -> () #
NFData CShort # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CShort -> () #
NFData CUShort # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CUShort -> () #
NFData CInt # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CInt -> () #
NFData CUInt # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CUInt -> () #
NFData CLong # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CLong -> () #
NFData CULong # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CULong -> () #
NFData CLLong # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CLLong -> () #
NFData CULLong # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CULLong -> () #
NFData CBool # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods rnf :: CBool -> () #
NFData CFloat # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CFloat -> () #
NFData CDouble # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CDouble -> () #
NFData CPtrdiff # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CPtrdiff -> () #
NFData CSize # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CSize -> () #
NFData CWchar # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CWchar -> () #
NFData CSigAtomic # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CSigAtomic -> () #
NFData CClock # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CClock -> () #
NFData CTime # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CTime -> () #
NFData CUSeconds # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CUSeconds -> () #
NFData CSUSeconds # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CSUSeconds -> () #
NFData CFile # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CFile -> () #
NFData CFpos # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CFpos -> () #
NFData CJmpBuf # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CJmpBuf -> () #
NFData CIntPtr # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CIntPtr -> () #
NFData CUIntPtr # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CUIntPtr -> () #
NFData CIntMax # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CIntMax -> () #
NFData CUIntMax # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: CUIntMax -> () #
NFData Fingerprint # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Fingerprint -> () #
NFData SrcLoc # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: SrcLoc -> () #
NFData a => NFData [a] # |
Instance details Defined in Control.DeepSeq Methods rnf :: [a] -> () #
NFData a => NFData (Maybe a) # |
Instance details Defined in Control.DeepSeq Methods rnf :: Maybe a -> () #
NFData a => NFData (Ratio a) # |
Instance details Defined in Control.DeepSeq Methods rnf :: Ratio a -> () #
NFData (Ptr a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: Ptr a -> () #
NFData (FunPtr a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: FunPtr a -> () #
NFData a => NFData (Complex a) # |
Instance details Defined in Control.DeepSeq Methods rnf :: Complex a -> () #
NFData (Fixed a) # | Since: deepseq-1.3.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Fixed a -> () #
NFData a => NFData (Min a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: Min a -> () #
NFData a => NFData (Max a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: Max a -> () #
NFData a => NFData (First a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: First a -> () #
NFData a => NFData (Last a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: Last a -> () #
NFData m => NFData (WrappedMonoid m) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: WrappedMonoid m -> () #
NFData a => NFData (Option a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: Option a -> () #
NFData (StableName a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: StableName a -> () #
NFData a => NFData (ZipList a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: ZipList a -> () #
NFData a => NFData (Identity a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Identity a -> () #
NFData (IORef a) # | NOTE: Only strict in the reference and not the referenced value. Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: IORef a -> () #
NFData a => NFData (First a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: First a -> () #
NFData a => NFData (Last a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Last a -> () #
NFData a => NFData (Dual a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Dual a -> () #
NFData a => NFData (Sum a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Sum a -> () #
NFData a => NFData (Product a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Product a -> () #
NFData a => NFData (Down a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Down a -> () #
NFData (MVar a) # | NOTE: Only strict in the reference and not the referenced value. Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: MVar a -> () #
NFData a => NFData (NonEmpty a) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: NonEmpty a -> () #
NFData (a -> b) # | This instance is for convenience and consistency with `seq`. This assumes that WHNF is equivalent to NF for functions. Since: deepseq-1.3.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: (a -> b) -> () #
(NFData a, NFData b) => NFData (Either a b) # |
Instance details Defined in Control.DeepSeq Methods rnf :: Either a b -> () #
(NFData a, NFData b) => NFData (a, b) # |
Instance details Defined in Control.DeepSeq Methods rnf :: (a, b) -> () #
(NFData a, NFData b) => NFData (Array a b) # |
Instance details Defined in Control.DeepSeq Methods rnf :: Array a b -> () #
(NFData a, NFData b) => NFData (Arg a b) # | Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: Arg a b -> () #
NFData (Proxy a) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Proxy a -> () #
NFData (STRef s a) # | NOTE: Only strict in the reference and not the referenced value. Since: deepseq-1.4.2.0
Instance details Defined in Control.DeepSeq Methods rnf :: STRef s a -> () #
(NFData a1, NFData a2, NFData a3) => NFData (a1, a2, a3) # |
Instance details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3) -> () #
NFData a => NFData (Const a b) # | Since: deepseq-1.4.0.0
Instance details Defined in Control.DeepSeq Methods rnf :: Const a b -> () #
NFData (a :~: b) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods rnf :: (a :~: b) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4) => NFData (a1, a2, a3, a4) # |
Instance details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4) -> () #
(NFData1 f, NFData1 g, NFData a) => NFData (Product f g a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods rnf :: Product f g a -> () #
(NFData1 f, NFData1 g, NFData a) => NFData (Sum f g a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods rnf :: Sum f g a -> () #
NFData (a :~~: b) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods rnf :: (a :~~: b) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5) # |
Instance details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4, a5) -> () #
(NFData1 f, NFData1 g, NFData a) => NFData (Compose f g a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods rnf :: Compose f g a -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData (a1, a2, a3, a4, a5, a6) # |
Instance details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4, a5, a6) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData (a1, a2, a3, a4, a5, a6, a7) # |
Instance details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4, a5, a6, a7) -> () #
(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 details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4, a5, a6, a7, a8) -> () #
(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 details Defined in Control.DeepSeq Methods rnf :: (a1, a2, a3, a4, a5, a6, a7, a8, a9) -> () #

# Helper functions

deepseq :: NFData a => a -> b -> b #

`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: deepseq-1.1.0.0

force :: NFData a => a -> a #

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 ()

Finally, here's an exception safe variant of the `readFile'` example:

    readFile' :: FilePath -> IO String
    readFile' fn = bracket (openFile fn ReadMode) hClose $ \h ->
                           evaluate . force =<< hGetContents h

Since: deepseq-1.2.0.0

($!!) :: NFData a => (a -> b) -> a -> b infixr 0 #

the deep analogue of `$!`. In the expression `f $!! x`, `x` is fully evaluated before the function `f` is applied to it.

Since: deepseq-1.2.0.0

(<$!!>) :: (Monad m, NFData b) => (a -> b) -> m a -> m b infixl 4 #

Deeply strict version of `<$>`.

Since: deepseq-1.4.3.0

rwhnf :: a -> () #

Reduce to weak head normal form

Equivalent to `\x -> `seq` x ()`.

Useful for defining `NFData` for types for which NF=WHNF holds.

    data T = C1 | C2 | C3
    instance NFData T where rnf = rwhnf

Since: deepseq-1.4.3.0

# Liftings of the `NFData` class

## For unary constructors

class NFData1 f where #

A class of functors that can be fully evaluated.

Since: deepseq-1.4.3.0

Minimal complete definition

Nothing

Methods

liftRnf :: (a -> ()) -> f a -> () #

`liftRnf` should reduce its argument to normal form (that is, fully evaluate all sub-components), given an argument to reduce `a` arguments, and then return '()'.

See `rnf` for the generic deriving.

liftRnf :: (Generic1 f, GNFData One (Rep1 f)) => (a -> ()) -> f a -> () #

`liftRnf` should reduce its argument to normal form (that is, fully evaluate all sub-components), given an argument to reduce `a` arguments, and then return '()'.

See `rnf` for the generic deriving.

Instances

NFData1 [] # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> [a] -> () #
NFData1 Maybe # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Maybe a -> () #
NFData1 Ratio # | Available on `base >=4.9` Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Ratio a -> () #
NFData1 Ptr # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Ptr a -> () #
NFData1 FunPtr # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> FunPtr a -> () #
NFData1 Fixed # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Fixed a -> () #
NFData1 Min # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Min a -> () #
NFData1 Max # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Max a -> () #
NFData1 First # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> First a -> () #
NFData1 Last # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Last a -> () #
NFData1 WrappedMonoid # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> WrappedMonoid a -> () #
NFData1 Option # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Option a -> () #
NFData1 StableName # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> StableName a -> () #
NFData1 ZipList # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> ZipList a -> () #
NFData1 Identity # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Identity a -> () #
NFData1 IORef # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> IORef a -> () #
NFData1 First # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> First a -> () #
NFData1 Last # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Last a -> () #
NFData1 Dual # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Dual a -> () #
NFData1 Sum # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Sum a -> () #
NFData1 Product # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Product a -> () #
NFData1 Down # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Down a -> () #
NFData1 MVar # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> MVar a -> () #
NFData1 NonEmpty # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> NonEmpty a -> () #
NFData a => NFData1 (Either a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> Either a a0 -> () #
NFData a => NFData1 ((,) a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> (a, a0) -> () #
NFData a => NFData1 (Array a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> Array a a0 -> () #
NFData a => NFData1 (Arg a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> Arg a a0 -> () #
NFData1 (Proxy :: Type -> Type) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Proxy a -> () #
NFData1 (STRef s) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> STRef s a -> () #
(NFData a1, NFData a2) => NFData1 ((,,) a1 a2) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a) -> () #
NFData a => NFData1 (Const a :: Type -> Type) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> Const a a0 -> () #
NFData1 ((:~:) a) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> (a :~: a0) -> () #
(NFData a1, NFData a2, NFData a3) => NFData1 ((,,,) a1 a2 a3) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a3, a) -> () #
(NFData1 f, NFData1 g) => NFData1 (Product f g) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Product f g a -> () #
(NFData1 f, NFData1 g) => NFData1 (Sum f g) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Sum f g a -> () #
NFData1 ((:~~:) a :: Type -> Type) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a0 -> ()) -> (a :~~: a0) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4) => NFData1 ((,,,,) a1 a2 a3 a4) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a3, a4, a) -> () #
(NFData1 f, NFData1 g) => NFData1 (Compose f g) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> Compose f g a -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData1 ((,,,,,) a1 a2 a3 a4 a5) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a3, a4, a5, a) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData1 ((,,,,,,) a1 a2 a3 a4 a5 a6) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a3, a4, a5, a6, a) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData1 ((,,,,,,,) a1 a2 a3 a4 a5 a6 a7) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7, NFData a8) => NFData1 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7 a8) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf :: (a -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a8, a) -> () #

rnf1 :: (NFData1 f, NFData a) => f a -> () #

Lift the standard `rnf` function through the type constructor.

Since: deepseq-1.4.3.0

## For binary constructors

class NFData2 p where #

A class of bifunctors that can be fully evaluated.

Since: deepseq-1.4.3.0

Methods

liftRnf2 :: (a -> ()) -> (b -> ()) -> p a b -> () #

`liftRnf2` should reduce its argument to normal form (that is, fully evaluate all sub-components), given functions to reduce `a` and `b` arguments respectively, and then return '()'.

Note: Unlike for the unary `liftRnf`, there is currently no support for generically deriving `liftRnf2`.

Instances

NFData2 Either # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Either a b -> () #
NFData2 (,) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a, b) -> () #
NFData2 Array # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Array a b -> () #
NFData2 Arg # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Arg a b -> () #
NFData2 STRef # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> STRef a b -> () #
NFData a1 => NFData2 ((,,) a1) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a, b) -> () #
NFData2 (Const :: Type -> Type -> Type) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Const a b -> () #
NFData2 ((:~:) :: Type -> Type -> Type) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a :~: b) -> () #
(NFData a1, NFData a2) => NFData2 ((,,,) a1 a2) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a, b) -> () #
NFData2 ((:~~:) :: Type -> Type -> Type) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a :~~: b) -> () #
(NFData a1, NFData a2, NFData a3) => NFData2 ((,,,,) a1 a2 a3) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a, b) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4) => NFData2 ((,,,,,) a1 a2 a3 a4) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a, b) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData2 ((,,,,,,) a1 a2 a3 a4 a5) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a, b) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData2 ((,,,,,,,) a1 a2 a3 a4 a5 a6) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a6, a, b) -> () #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData2 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7) # | Since: deepseq-1.4.3.0
Instance details Defined in Control.DeepSeq Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a, b) -> () #

rnf2 :: (NFData2 p, NFData a, NFData b) => p a b -> () #

Lift the standard `rnf` function through the type constructor.

Since: deepseq-1.4.3.0