úÎp @Try to infer whether type has the property that WHNF=NF for its  values.  A result of Nothing# means it is not known whether the $ property holds for the given type.  Just True means that the  property holds. AThis function has currently a very limited knowledge and returns  Nothing3 most of the time except for some primitive types. Derive  instance for simple Data-declarations Example usage for deriving  instance for the type TypeName:   $(deriveNFData ''TypeName) @The derivation tries to avoid evaluation of strict fields whose + types have the WHNF=NF property (see also ). For ' instance, consider the following type Foo:   data Foo a = Foo1  | Foo2 !Int !String  | Foo3 (Foo a) - | Foo4 { fX :: Int, fY :: Char }  | Foo a :--: !Bool  By invoking $(deriveNFData ''Foo) the generated  instance  will be equivalent to:  + instance NFData a => NFData (Foo a) where  rnf Foo1 = () % rnf (Foo2 _ x) = x `deepseq` () % rnf (Foo3 x) = x `deepseq` () 1 rnf (Foo4 x y) = x `deepseq` y `deepseq` () % rnf (x :--: _) = x `deepseq` ()  Known issues/ limitations:  TypeName must be a proper data typename (use the  GeneralizedNewtypeDeriving extension for newtype names) 9 Does not support existential types yet (i.e. use of the forall  keyword) 9 Does not always detect phantom type variables (e.g. for data  Foo a = Foo0 | Foo1 (Foo a) ) which causes those to require   instances. Plural version of  Convenience wrapper for  which allows to derive  multiple  instances for a list of TypeName s, e.g.: 9 $(deriveNFData [''TypeName1, ''TypeName2, ''TypeName3])   deepseq-th-0.0.0.0Control.DeepSeq.THwhnfIsNf deriveNFData deriveNFDatas whnfIsNf'deepseq-1.1.0.2Control.DeepSeqNFData getFreeTyVars mkDeepSeqExpr