stack-1.1.0: The Haskell Tool Stack

Safe HaskellNone
LanguageHaskell2010

Data.Binary.VersionTagged

Description

Tag a Binary instance with the stack version number to ensure we're reading a compatible format.

Synopsis

Documentation

taggedDecodeOrLoad :: (BinarySchema a, MonadIO m, MonadLogger m) => Path Abs File -> m a -> m a Source

Read from the given file. If the read fails, run the given action and write that back to the file. Always starts the file off with the version tag.

taggedEncodeFile :: (BinarySchema a, MonadIO m) => Path Abs File -> a -> m () Source

Write to the given file, with a binary-tagged tag.

class Binary t where

The Binary class provides put and get, methods to encode and decode a Haskell value to a lazy ByteString. It mirrors the Read and Show classes for textual representation of Haskell types, and is suitable for serialising Haskell values to disk, over the network.

For decoding and generating simple external binary formats (e.g. C structures), Binary may be used, but in general is not suitable for complex protocols. Instead use the Put and Get primitives directly.

Instances of Binary should satisfy the following property:

decode . encode == id

That is, the get and put methods should be the inverse of each other. A range of instances are provided for basic Haskell types.

Minimal complete definition

Nothing

Methods

put :: t -> Put

Encode a value in the Put monad.

get :: Get t

Decode a value in the Get monad

Instances

Binary Bool 
Binary Char 
Binary Double 
Binary Float 
Binary Int 
Binary Int8 
Binary Int16 
Binary Int32 
Binary Int64 
Binary Integer 
Binary Ordering 
Binary Word 
Binary Word8 
Binary Word16 
Binary Word32 
Binary Word64 
Binary () 
Binary OriginalModule 
Binary ExposedModule 
Binary Verbosity 
Binary PackageDescription 
Binary BuildType 
Binary ModuleRenaming 
Binary Library 
Binary ModuleReexport 
Binary Executable 
Binary TestSuite 
Binary TestSuiteInterface 
Binary TestType 
Binary Benchmark 
Binary BenchmarkInterface 
Binary BenchmarkType 
Binary BuildInfo 
Binary SourceRepo 
Binary RepoKind 
Binary RepoType 
Binary FlagName 
Binary OS 
Binary Arch 
Binary Platform 
Binary PackageName 
Binary PackageIdentifier 
Binary InstalledPackageId 
Binary PackageKey 
Binary Dependency 
Binary ModuleName 
Binary License 
Binary Compiler 
Binary PackageDB 
Binary OptimisationLevel 
Binary DebugInfoLevel 
Binary CompilerFlavor 
Binary CompilerId 
Binary CompilerInfo 
Binary AbiTag 
Binary Language 
Binary Extension 
Binary KnownExtension 
Binary VersionRange 
Binary ByteString 
Binary ByteString 
Binary Scientific 
Binary Natural 
Binary StructuralInfo 
Binary IntSet 
Binary UnixTime 
Binary Archive 
Binary Version 
Binary CompilerVersion 
Binary PackageName 
Binary PackageIdentifier 
Binary FlagName 
Binary MiniPackageInfo 
Binary MiniBuildPlan 
Binary ExeName 
Binary GhcPkgId 
Binary PackageDownload 
Binary PackageCacheMap 
Binary PackageCache 
Binary IndexName 
Binary ModTime 
Binary FileCacheInfo 
Binary PrecompiledCache 
Binary ConfigureOpts 
Binary ConfigCache 
Binary InstalledCacheEntry 
Binary a => Binary [a] 
(Binary a, Integral a) => Binary (Ratio a) 
Binary a => Binary (Maybe a) 
Binary m => Binary (InstalledPackageInfo_ m) 
Binary e => Binary (IntMap e) 
Binary a => Binary (Set a) 
Binary e => Binary (Tree e) 
Binary e => Binary (Seq e) 
(Binary a, Binary b) => Binary (Either a b) 
(Binary a, Binary b) => Binary (a, b) 
(Binary k, Binary e) => Binary (Map k e) 
(Binary i, Ix i, Binary e, IArray UArray e) => Binary (UArray i e) 
(Binary i, Ix i, Binary e) => Binary (Array i e) 
(Binary a, Binary b, Binary c) => Binary (a, b, c) 
(Binary a, HasStructuralInfo a, KnownNat v) => Binary (BinaryTagged Nat v a)

Version and structure hash are prepended to serialised stream

(Binary a, Binary b, Binary c, Binary d) => Binary (a, b, c, d) 
(Binary a, Binary b, Binary c, Binary d, Binary e) => Binary (a, b, c, d, e) 
(Binary a, Binary b, Binary c, Binary d, Binary e, Binary f) => Binary (a, b, c, d, e, f) 
(Binary a, Binary b, Binary c, Binary d, Binary e, Binary f, Binary g) => Binary (a, b, c, d, e, f, g) 
(Binary a, Binary b, Binary c, Binary d, Binary e, Binary f, Binary g, Binary h) => Binary (a, b, c, d, e, f, g, h) 
(Binary a, Binary b, Binary c, Binary d, Binary e, Binary f, Binary g, Binary h, Binary i) => Binary (a, b, c, d, e, f, g, h, i) 
(Binary a, Binary b, Binary c, Binary d, Binary e, Binary f, Binary g, Binary h, Binary i, Binary j) => Binary (a, b, c, d, e, f, g, h, i, j) 

class HasStructuralInfo a

Type class providing StructuralInfo for each data type.

For regular non-recursive ADTs HasStructuralInfo can be derived generically.

data Record = Record { a :: Int, b :: Bool, c :: [Char] } deriving (Generic)
instance hasStructuralInfo Record

For stable types, you can provide only type name

instance HasStructuralInfo Int where structuralInfo = ghcNominalType -- infer name from Generic information
instance HasStructuralInfo Integer where structuralInfo _ = NominalType "Integer"

Recursive type story is a bit sad atm. If the type structure is stable, you can do:

instance HasStructuralInfo a => HasStructuralInfo [a] where structuralInfo = ghcStructuralInfo1

Instances

HasStructuralInfo Bool 
HasStructuralInfo Char 
HasStructuralInfo Double

Since binary-tagged-0.1.3.0

HasStructuralInfo Float

Since binary-tagged-0.1.3.0

HasStructuralInfo Int 
HasStructuralInfo Int8 
HasStructuralInfo Int16 
HasStructuralInfo Int32 
HasStructuralInfo Int64 
HasStructuralInfo Integer 
HasStructuralInfo Ordering

Since binary-tagged-0.1.3.0

HasStructuralInfo Word 
HasStructuralInfo Word8 
HasStructuralInfo Word16 
HasStructuralInfo Word32 
HasStructuralInfo Word64 
HasStructuralInfo ()

Since binary-tagged-0.1.3.0

HasStructuralInfo Version

Since binary-tagged-0.1.3.0

HasStructuralInfo ByteString 
HasStructuralInfo ByteString 
HasStructuralInfo Text 
HasStructuralInfo UTCTime 
HasStructuralInfo Value 
HasStructuralInfo Text 
HasStructuralInfo E0 
HasStructuralInfo E1 
HasStructuralInfo E2 
HasStructuralInfo E3 
HasStructuralInfo E6 
HasStructuralInfo E9 
HasStructuralInfo E12 
HasStructuralInfo Natural

Since binary-tagged-0.1.4.0

HasStructuralInfo All

Since binary-tagged-0.1.4.0

HasStructuralInfo Any

Since binary-tagged-0.1.4.0

HasStructuralInfo StructuralInfo 
HasStructuralInfo IntSet 
HasStructuralInfo DiffTime 
HasStructuralInfo LocalTime 
HasStructuralInfo TimeOfDay 
HasStructuralInfo TimeZone 
HasStructuralInfo NominalDiffTime 
HasStructuralInfo Day 
HasStructuralInfo UniversalTime 
HasStructuralInfo Version 
HasStructuralInfo CompilerVersion 
HasStructuralInfo PackageName 
HasStructuralInfo PackageIdentifier 
HasStructuralInfo FlagName 
HasStructuralInfo MiniPackageInfo 
HasStructuralInfo MiniBuildPlan 
HasStructuralInfo ExeName 
HasStructuralInfo GhcPkgId 
HasStructuralInfo PackageDownload 
HasStructuralInfo PackageCacheMap 
HasStructuralInfo PackageCache 
HasStructuralInfo ModTime 
HasStructuralInfo FileCacheInfo 
HasStructuralInfo PrecompiledCache 
HasStructuralInfo ConfigureOpts 
HasStructuralInfo ConfigCache 
HasStructuralInfo InstalledCacheEntry 
HasStructuralInfo a => HasStructuralInfo [a] 
HasStructuralInfo a => HasStructuralInfo (Ratio a) 
HasStructuralInfo a => HasStructuralInfo (Maybe a) 
HasStructuralInfo a => HasStructuralInfo (Fixed a)

Since binary-tagged-0.1.3.0

HasStructuralInfo a => HasStructuralInfo (Dual a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Sum a) 
HasStructuralInfo a => HasStructuralInfo (Product a) 
HasStructuralInfo a => HasStructuralInfo (First a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Last a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (IntMap a) 
HasStructuralInfo a => HasStructuralInfo (Set a) 
HasStructuralInfo a => HasStructuralInfo (Seq a) 
HasStructuralInfo a => HasStructuralInfo (Min a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Max a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (First a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Last a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (WrappedMonoid a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (Option a)

Since binary-tagged-0.1.4.0

HasStructuralInfo a => HasStructuralInfo (NonEmpty a) 
HasStructuralInfo a => HasStructuralInfo (HashSet a) 
HasStructuralInfo a => HasStructuralInfo (Vector a) 
HasStructuralInfo a => HasStructuralInfo (Vector a) 
HasStructuralInfo a => HasStructuralInfo (Vector a) 
(HasStructuralInfo a, HasStructuralInfo b) => HasStructuralInfo (Either a b) 
(HasStructuralInfo a, HasStructuralInfo b) => HasStructuralInfo (a, b) 
(HasStructuralInfo k, HasStructuralInfo v) => HasStructuralInfo (HashMap k v) 
(HasStructuralInfo k, HasStructuralInfo v) => HasStructuralInfo (Map k v) 
(HasStructuralInfo i, HasStructuralInfo e) => HasStructuralInfo (UArray i e) 
(HasStructuralInfo i, HasStructuralInfo e) => HasStructuralInfo (Array i e) 
(HasStructuralInfo a, HasStructuralInfo b, HasStructuralInfo c) => HasStructuralInfo (a, b, c) 
(HasStructuralInfo a, HasStructuralInfo b, HasStructuralInfo c, HasStructuralInfo d) => HasStructuralInfo (a, b, c, d) 

class KnownNat (SemanticVersion a) => HasSemanticVersion a

A helper type family for encodeTaggedFile and decodeTaggedFile.

The default definition is SemanticVersion a = 0

Instances

HasSemanticVersion Bool 
HasSemanticVersion Char 
HasSemanticVersion Double

Since binary-tagged-0.1.3.0

HasSemanticVersion Float

Since binary-tagged-0.1.3.0

HasSemanticVersion Int 
HasSemanticVersion Int8 
HasSemanticVersion Int16 
HasSemanticVersion Int32 
HasSemanticVersion Int64 
HasSemanticVersion Integer 
HasSemanticVersion Ordering

Since binary-tagged-0.1.3.0

HasSemanticVersion Word 
HasSemanticVersion Word8 
HasSemanticVersion Word16 
HasSemanticVersion Word32 
HasSemanticVersion Word64 
HasSemanticVersion ()

Since binary-tagged-0.1.3.0

HasSemanticVersion Version

Since binary-tagged-0.1.3.0

HasSemanticVersion ByteString 
HasSemanticVersion ByteString 
HasSemanticVersion Text 
HasSemanticVersion UTCTime 
HasSemanticVersion Value 
HasSemanticVersion Text 
HasSemanticVersion Natural

Since binary-tagged-0.1.4.0

HasSemanticVersion All

Since binary-tagged-0.1.4.0

HasSemanticVersion Any

Since binary-tagged-0.1.4.0

HasSemanticVersion StructuralInfo 
HasSemanticVersion IntSet 
HasSemanticVersion DiffTime 
HasSemanticVersion LocalTime 
HasSemanticVersion TimeOfDay 
HasSemanticVersion TimeZone 
HasSemanticVersion NominalDiffTime 
HasSemanticVersion Day 
HasSemanticVersion UniversalTime 
HasSemanticVersion MiniBuildPlan 
HasSemanticVersion PackageCacheMap 
HasSemanticVersion ModTime 
HasSemanticVersion PrecompiledCache 
HasSemanticVersion ConfigCache 
HasSemanticVersion a => HasSemanticVersion [a] 
HasSemanticVersion a => HasSemanticVersion (Ratio a) 
HasSemanticVersion a => HasSemanticVersion (Maybe a) 
HasSemanticVersion (Fixed a)

Since binary-tagged-0.1.3.0

HasSemanticVersion a => HasSemanticVersion (Dual a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Sum a) 
HasSemanticVersion a => HasSemanticVersion (Product a) 
HasSemanticVersion a => HasSemanticVersion (First a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Last a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (IntMap a) 
HasSemanticVersion a => HasSemanticVersion (Set a) 
HasSemanticVersion a => HasSemanticVersion (Seq a) 
HasSemanticVersion a => HasSemanticVersion (Min a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Max a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (First a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Last a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (WrappedMonoid a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (Option a)

Since binary-tagged-0.1.4.0

HasSemanticVersion a => HasSemanticVersion (NonEmpty a) 
HasSemanticVersion a => HasSemanticVersion (HashSet a) 
HasSemanticVersion a => HasSemanticVersion (Vector a) 
HasSemanticVersion a => HasSemanticVersion (Vector a) 
HasSemanticVersion a => HasSemanticVersion (Vector a) 
(HasSemanticVersion a, HasSemanticVersion b, KnownNat (SemanticVersion (Either a b))) => HasSemanticVersion (Either a b) 
(HasSemanticVersion a, HasSemanticVersion b, KnownNat (SemanticVersion (a, b))) => HasSemanticVersion (a, b) 
(HasSemanticVersion k, HasSemanticVersion v, KnownNat (SemanticVersion (HashMap k v))) => HasSemanticVersion (HashMap k v) 
(HasSemanticVersion k, HasSemanticVersion v, KnownNat (SemanticVersion (Map k v))) => HasSemanticVersion (Map k v) 
(HasSemanticVersion i, HasSemanticVersion e, KnownNat (SemanticVersion (UArray i e))) => HasSemanticVersion (UArray i e) 
(HasSemanticVersion i, HasSemanticVersion e, KnownNat (SemanticVersion (Array i e))) => HasSemanticVersion (Array i e) 
(HasSemanticVersion a, HasSemanticVersion b, HasSemanticVersion c, KnownNat (SemanticVersion (a, b, c))) => HasSemanticVersion (a, b, c)

Since binary-tagged-0.1.3.0

(HasSemanticVersion a, HasSemanticVersion b, HasSemanticVersion c, HasSemanticVersion d, KnownNat (SemanticVersion (a, b, c, d))) => HasSemanticVersion (a, b, c, d)

Since binary-tagged-0.1.3.0

decodeFileOrFailDeep :: (BinarySchema a, MonadIO m, MonadThrow n) => Path loc File -> m (n a) Source

Ensure that there are no lurking exceptions deep inside the parsed value... because that happens unfortunately. See https://github.com/commercialhaskell/stack/issues/554

class NFData a where

A class of types that can be fully evaluated.

Since: 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.

{-# LANGUAGE DeriveGeneric #-}

import GHC.Generics (Generic)
import Control.DeepSeq

data Foo a = Foo a String
             deriving (Eq, Generic)

instance NFData a => NFData (Foo a)

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, NFData)

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

{-# LANGUAGE BangPatterns #-}
instance NFData Colour where rnf !_ = ()

Instances

NFData Bool 
NFData Char 
NFData Double 
NFData Float 
NFData Int 
NFData Int8 
NFData Int16 
NFData Int32 
NFData Int64 
NFData Integer 
NFData Word 
NFData Word8 
NFData Word16 
NFData Word32 
NFData Word64 
NFData TypeRep

NOTE: Only defined for base-4.8.0.0 and later

Since: 1.4.0.0

NFData () 
NFData PackageName 
NFData PackageIdentifier 
NFData PackageKey 
NFData Version

Since: 1.3.0.0

NFData ByteString 
NFData ByteString 
NFData Scientific 
NFData Number 
NFData UTCTime 
NFData Value 
NFData ThreadId

Since: 1.4.0.0

NFData Void

Defined as rnf = absurd.

Since: 1.4.0.0

NFData Unique

Since: 1.4.0.0

NFData Natural

Since: 1.4.0.0

NFData CChar

Since: 1.4.0.0

NFData CSChar

Since: 1.4.0.0

NFData CUChar

Since: 1.4.0.0

NFData CShort

Since: 1.4.0.0

NFData CUShort

Since: 1.4.0.0

NFData CInt

Since: 1.4.0.0

NFData CUInt

Since: 1.4.0.0

NFData CLong

Since: 1.4.0.0

NFData CULong

Since: 1.4.0.0

NFData CLLong

Since: 1.4.0.0

NFData CULLong

Since: 1.4.0.0

NFData CFloat

Since: 1.4.0.0

NFData CDouble

Since: 1.4.0.0

NFData CPtrdiff

Since: 1.4.0.0

NFData CSize

Since: 1.4.0.0

NFData CWchar

Since: 1.4.0.0

NFData CSigAtomic

Since: 1.4.0.0

NFData CClock

Since: 1.4.0.0

NFData CTime

Since: 1.4.0.0

NFData CUSeconds

Since: 1.4.0.0

NFData CSUSeconds

Since: 1.4.0.0

NFData CFile

Since: 1.4.0.0

NFData CFpos

Since: 1.4.0.0

NFData CJmpBuf

Since: 1.4.0.0

NFData CIntPtr

Since: 1.4.0.0

NFData CUIntPtr

Since: 1.4.0.0

NFData CIntMax

Since: 1.4.0.0

NFData CUIntMax

Since: 1.4.0.0

NFData All

Since: 1.4.0.0

NFData Any

Since: 1.4.0.0

NFData TyCon

NOTE: Only defined for base-4.8.0.0 and later

Since: 1.4.0.0

NFData Fingerprint

Since: 1.4.0.0

NFData ShortByteString 
NFData IntSet 
NFData DiffTime 
NFData URI 
NFData URIAuth 
NFData Doc 
NFData TextDetails 
NFData FormatError 
NFData Entry 
NFData EntryContent 
NFData Ownership 
NFData TarPath 
NFData LinkTarget 
NFData UnicodeException 
NFData LocalTime 
NFData ZonedTime 
NFData TimeOfDay 
NFData TimeZone 
NFData NominalDiffTime 
NFData Day 
NFData UniversalTime 
NFData Version 
NFData CompilerVersion 
NFData PackageName 
NFData PackageIdentifier 
NFData FlagName 
NFData MiniPackageInfo 
NFData MiniBuildPlan 
NFData ExeName 
NFData GhcPkgId 
NFData PackageDownload 
NFData PackageCacheMap 
NFData PackageCache 
NFData ModTime 
NFData FileCacheInfo 
NFData PrecompiledCache 
NFData ConfigureOpts 
NFData ConfigCache 
NFData InstalledCacheEntry 
NFData a => NFData [a] 
(Integral a, NFData a) => NFData (Ratio a) 
NFData a => NFData (Maybe a) 
NFData a => NFData (Result a) 
NFData r => NFData (Result r) 
NFData (StableName a)

Since: 1.4.0.0

NFData a => NFData (Identity a)

Since: 1.4.0.0

NFData (Fixed a)

Since: 1.3.0.0

NFData a => NFData (Complex a) 
NFData a => NFData (ZipList a)

Since: 1.4.0.0

NFData a => NFData (Dual a)

Since: 1.4.0.0

NFData a => NFData (Sum a)

Since: 1.4.0.0

NFData a => NFData (Product a)

Since: 1.4.0.0

NFData a => NFData (First a)

Since: 1.4.0.0

NFData a => NFData (Last a)

Since: 1.4.0.0

NFData a => NFData (Down a)

Since: 1.4.0.0

NFData s => NFData (CI s) 
NFData a => NFData (Digit a) 
NFData a => NFData (Node a) 
NFData a => NFData (Elem a) 
NFData a => NFData (FingerTree a) 
NFData a => NFData (IntMap a) 
NFData a => NFData (Set a) 
NFData a => NFData (Tree a) 
NFData a => NFData (Seq a) 
NFData a => NFData (DList a) 
NFData a => NFData (Min a) 
NFData a => NFData (Max a) 
NFData a => NFData (First a) 
NFData a => NFData (Last a) 
NFData m => NFData (WrappedMonoid m) 
NFData a => NFData (Option a) 
NFData a => NFData (NonEmpty a) 
NFData e => NFData (Entries e) 
NFData a => NFData (Array a) 
NFData a => NFData (HashSet a) 
NFData a => NFData (Vector a) 
NFData (Vector a) 
NFData (Vector a) 
NFData (Vector a) 
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

(NFData a, NFData b) => NFData (Either a b) 
(NFData a, NFData b) => NFData (a, b) 
(NFData k, NFData v) => NFData (HashMap k v) 
(NFData k, NFData a) => NFData (Map k a) 
(Ix a, NFData a, NFData b) => NFData (Array a b) 
(NFData i, NFData r) => NFData (IResult i r) 
NFData a => NFData (Const a b)

Since: 1.4.0.0

NFData (Proxy * a)

Since: 1.4.0.0

NFData (Path b t) 
(NFData a, NFData b) => NFData (Arg a b) 
(NFData k, NFData v) => NFData (Leaf k v) 
NFData (MVector s a) 
NFData (MVector s a) 
NFData (MVector s a) 
(NFData a, NFData b, NFData c) => NFData (a, b, c) 
NFData b => NFData (Tagged k s b) 
(NFData a, NFData b, NFData c, NFData d) => NFData (a, b, c, d) 
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5) => NFData (a1, a2, a3, a4, a5) 
(NFData a1, NFData a2, NFData a3, NFData a4, NFData a5, NFData a6) => NFData (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) 
(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) 
(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)