Control.DeepSeq

deepseq-1.4.3.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: 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

class NFData a where Source #

A class of types that can be fully evaluated.

Since: 1.1.0.0

Methods

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

# Helper functions

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

`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

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

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: 1.2.0.0

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

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

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

Deeply strict version of `<$>`.

Since: 1.4.3.0

rwhnf :: a -> () Source #

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: 1.4.3.0

# Liftings of the `NFData` class

## For unary constructors

class NFData1 f where Source #

A class of functors that can be fully evaluated.

Since: 1.4.3.0

Methods

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

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

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

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

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

Since: 1.4.3.0

## For binary constructors

class NFData2 p where Source #

A class of bifunctors that can be fully evaluated.

Since: 1.4.3.0

Minimal complete definition

liftRnf2

Methods

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

`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: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Either a b -> () Source #
NFData2 (,) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a, b) -> () Source #
NFData2 Array # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Array a b -> () Source #
NFData2 Arg # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Arg a b -> () Source #
NFData2 STRef # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> STRef a b -> () Source #
NFData a1 => NFData2 ((,,) a1) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a, b) -> () Source #
NFData2 (Const :: * -> * -> *) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> Const a b -> () Source #
NFData2 ((:~:) :: * -> * -> *) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a :~: b) -> () Source #
(NFData a1, NFData a2) => NFData2 ((,,,) a1 a2) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a, b) -> () Source #
NFData2 ((:~~:) :: * -> * -> *) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a :~~: b) -> () Source #
(NFData a1, NFData a2, NFData a3) => NFData2 ((,,,,) a1 a2 a3) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a, b) -> () Source #
(NFData a1, NFData a2, NFData a3, NFData a4) => NFData2 ((,,,,,) a1 a2 a3 a4) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a, b) -> () Source #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData2 ((,,,,,,) a1 a2 a3 a4 a5) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a, b) -> () Source #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData2 ((,,,,,,,) a1 a2 a3 a4 a5 a6) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a6, a, b) -> () Source #
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6, NFData a7) => NFData2 ((,,,,,,,,) a1 a2 a3 a4 a5 a6 a7) # | Since: 1.4.3.0
Instance details Methods liftRnf2 :: (a -> ()) -> (b -> ()) -> (a1, a2, a3, a4, a5, a6, a7, a, b) -> () Source #

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

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

Since: 1.4.3.0