úÎ+L*›GHC experimentalNoneTry to infer whether ' 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. CThis function has currently a rather limited knowledge and returns  Nothing6 most of the time except for some primitive types and  other simple cases.  See also   Whilelist of  known to be WHNF=NF Try to infer whether a $ which defines a type which has the @ property that WHNF=NF for its values. This property is derived , statically via the following simple rules:  newtype-s are WHNF=NF if the wrapped type is WHNF=NF  type-s are WHNF=NF if the aliased type is WHNF=NF  Types defined by data) are WHNF=NF if all constructors contain * only strict fields with WHNF=NF types Known limitations:  Doesn'9t work properly with parametrized declarations (in which  case Nothing# is returned) or existential types  See also  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  and  .). For instance, consider the following types Foo  and Bar:   data Foo a = Foo1  | Foo2 !Int !String  | Foo3 (Foo a) - | Foo4 { fX :: Int, fY :: Char }  | Foo5 !Bar $ | Foo6 !(String -> Int)  | Foo a :--: !Bool  ; data Bar = Bar0 | Bar1 !Char | Bar2 !Int !Int | Bar3 !Bar  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 (Foo5 _) = ()  rnf (Foo6 _) = () % rnf (x :--: _) = x `deepseq` () Whereas $(deriveNFData ''Bar)! generates the following default   instance since Bar is inferred as a WHNF=NF type:   instance NFData Bar  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.1.0.4Control.DeepSeq.TH typeWhnfIsNf decWhnfIsNf deriveNFData deriveNFDatastemplate-haskellLanguage.Haskell.TH.SyntaxTypeknownWhnfIsNfNamesNameDecdeepseq-1.3.0.1Control.DeepSeqNFData typeWhnfIsNf2 decWhnfIsNf2 getFreeTyVars mkDeepSeqExpr