Data

This module provides the Data class with its primitives for generic programming, along with instances for many datatypes. It corresponds to a merge between the previous Data.Generics.Basics and almost all of Data.Generics.Instances. The instances that are not present in this module were moved to the Data.Generics.Instances module in the syb package. "Scrap your boilerplate" --- Generic programming in Haskell. See https://wiki.haskell.org/Research_papers/Generics#Scrap_your_boilerplate.21.
The Data class comprehends a fundamental primitive gfoldl for folding over constructor applications, say terms. This primitive can be instantiated in several ways to map over the immediate subterms of a term; see the gmap combinators later in this class. Indeed, a generic programmer does not necessarily need to use the ingenious gfoldl primitive but rather the intuitive gmap combinators. The gfoldl primitive is completed by means to query top-level constructors, to turn constructor representations into proper terms, and to list all possible datatype constructors. This completion allows us to serve generic programming scenarios like read, show, equality, term generation. The combinators gmapT, gmapQ, gmapM, etc are all provided with default definitions in terms of gfoldl, leaving open the opportunity to provide datatype-specific definitions. (The inclusion of the gmap combinators as members of class Data allows the programmer or the compiler to derive specialised, and maybe more efficient code per datatype. Note: gfoldl is more higher-order than the gmap combinators. This is subject to ongoing benchmarking experiments. It might turn out that the gmap combinators will be moved out of the class Data.) Conceptually, the definition of the gmap combinators in terms of the primitive gfoldl requires the identification of the gfoldl function arguments. Technically, we also need to identify the type constructor c for the construction of the result type from the folded term type. In the definition of gmapQx combinators, we use phantom type constructors for the c in the type of gfoldl because the result type of a query does not involve the (polymorphic) type of the term argument. In the definition of gmapQl we simply use the plain constant type constructor because gfoldl is left-associative anyway and so it is readily suited to fold a left-associative binary operation over the immediate subterms. In the definition of gmapQr, extra effort is needed. We use a higher-order accumulation trick to mediate between left-associative constructor application vs. right-associative binary operation (e.g., (:)). When the query is meant to compute a value of type r, then the result type within generic folding is r -> r. So the result of folding is a function to which we finally pass the right unit. With the -XDeriveDataTypeable option, GHC can generate instances of the Data class automatically. For example, given the declaration
data T a b = C1 a b | C2 deriving (Typeable, Data)
GHC will generate an instance that is equivalent to
instance (Data a, Data b) => Data (T a b) where
gfoldl k z (C1 a b) = z C1 `k` a `k` b
gfoldl k z C2       = z C2

gunfold k z c = case constrIndex c of
1 -> k (k (z C1))
2 -> z C2

toConstr (C1 _ _) = con_C1
toConstr C2       = con_C2

dataTypeOf _ = ty_T

con_C1 = mkConstr ty_T "C1" [] Prefix
con_C2 = mkConstr ty_T "C2" [] Prefix
ty_T   = mkDataType "Module.T" [con_C1, con_C2]
This is suitable for datatypes that are exported transparently.
Handle conversion of CmmData to LLVM code.
This module provides functions for creation and manipulation of vectors and matrices, IO, and other utilities.
Access to pandoc's data files.
This module defines Uniplate / Biplate instances for every type with a Data instance. Using GHC, Data can be derived automatically with:
data Expr = Var Int | Neg Expr | Add Expr Expr
deriving (Data,Typeable)
All the Uniplate operations defined in Data.Generics.Uniplate.Operations can be used. If you are working with abstract data types, such as Map or Set from the containers package, you may also need to use the data types defined in Data.Generics.Uniplate.Data.Instances. For faster performance (5x faster, but requires writing instances) switch to Data.Generics.Uniplate.Direct. If you get instance conflicts when using both Data and Direct, switch to Data.Generics.Uniplate.DataOnly. The instances are faster than GHC because they precompute a table of useful information, then use this information when performing the traversals. Sometimes it is not possible to compute the table, in which case this library will perform about the same speed as SYB. Setting the environment variable $UNIPLATE_VERBOSE has the following effects:
  • -1 - raise a program error every time construction of the table fails
  • 0 (or unset) - never print any messages or raise any errors
  • 1 - give a message every time a table is computed
  • 2 - give a message when table computation fails
The $UNIPLATE_VERBOSE environment variable must be set before the first call to uniplate.
An opaque data structure that represents a keyed data list. See also: Keyed data lists.
Memory-managed wrapper type.
The Data class comprehends a fundamental primitive gfoldl for folding over constructor applications, say terms. This primitive can be instantiated in several ways to map over the immediate subterms of a term; see the gmap combinators later in this class. Indeed, a generic programmer does not necessarily need to use the ingenious gfoldl primitive but rather the intuitive gmap combinators. The gfoldl primitive is completed by means to query top-level constructors, to turn constructor representations into proper terms, and to list all possible datatype constructors. This completion allows us to serve generic programming scenarios like read, show, equality, term generation. The combinators gmapT, gmapQ, gmapM, etc are all provided with default definitions in terms of gfoldl, leaving open the opportunity to provide datatype-specific definitions. (The inclusion of the gmap combinators as members of class Data allows the programmer or the compiler to derive specialised, and maybe more efficient code per datatype. Note: gfoldl is more higher-order than the gmap combinators. This is subject to ongoing benchmarking experiments. It might turn out that the gmap combinators will be moved out of the class Data.) Conceptually, the definition of the gmap combinators in terms of the primitive gfoldl requires the identification of the gfoldl function arguments. Technically, we also need to identify the type constructor c for the construction of the result type from the folded term type. In the definition of gmapQx combinators, we use phantom type constructors for the c in the type of gfoldl because the result type of a query does not involve the (polymorphic) type of the term argument. In the definition of gmapQl we simply use the plain constant type constructor because gfoldl is left-associative anyway and so it is readily suited to fold a left-associative binary operation over the immediate subterms. In the definition of gmapQr, extra effort is needed. We use a higher-order accumulation trick to mediate between left-associative constructor application vs. right-associative binary operation (e.g., (:)). When the query is meant to compute a value of type r, then the result type withing generic folding is r -> r. So the result of folding is a function to which we finally pass the right unit. With the -XDeriveDataTypeable option, GHC can generate instances of the Data class automatically. For example, given the declaration
data T a b = C1 a b | C2 deriving (Typeable, Data)
GHC will generate an instance that is equivalent to
instance (Data a, Data b) => Data (T a b) where
gfoldl k z (C1 a b) = z C1 `k` a `k` b
gfoldl k z C2       = z C2

gunfold k z c = case constrIndex c of
1 -> k (k (z C1))
2 -> z C2

toConstr (C1 _ _) = con_C1
toConstr C2       = con_C2

dataTypeOf _ = ty_T

con_C1 = mkConstr ty_T "C1" [] Prefix
con_C2 = mkConstr ty_T "C2" [] Prefix
ty_T   = mkDataType "Module.T" [con_C1, con_C2]
This is suitable for datatypes that are exported transparently.
TextShow instances for data types in the Data.Data module. Since: 2
Common data types for Language.C: Identifiers, unique names, source code locations, ast node attributes and extensible errors.
Generic combinators to derive type class instances.

Orphans

The Orphans module should be imported to derive the following classes using this library:

Minor discrepancies

Here are documented some corner cases of deriving, both by GHC and generic-data. They are all minor and unlikely to cause problems in practice.

Empty types

  • Some of the derived methods are lazy, which might result in errors being silenced, though unlikely.
  • The only generic-data implementation which differs from GHC stock instances is gfoldMap.
TODO: table

Single-constructor single-field types

data types with one constructor and one field are extremely rare. newtype is almost always more appropriate (for which there is no issue). That said, for data types both strict and lazy, all generic-data implementations are lazy (they don't even force the constructor), whereas GHC stock implementations, when they exist, are strict.

Functor composition

Fields of functors involving the composition of two or more functors f (g (h a)) result in some overhead using GHC.Generics.Generic1. This is due to a particular encoding choice of GHC.Generics, where composition are nested to the right instead of to the left. f (g (h _)) is represented by the functor f :.: (g :.: Rec1 h), so one must use fmap on f to convert that back to f (g (h _)). A better choice would have been to encode it as (Rec1 f :.: g) :.: h, because that is coercible back to f (g (h _)).
Generic representations as data types.

Warning

This is an internal module: it is not subject to any versioning policy, breaking changes can happen at any time. If something here seems useful, please report it or create a pull request to export it from an external module.
Synthetic data type. A wrapper to view a generic Rep as the datatype it's supposed to represent, without needing a declaration.
Synthetic data type. A wrapper to view a generic Rep as the datatype it's supposed to represent, without needing a declaration.
This module re-exports the GitHub.Data. and GitHub.Auth submodules.
Data part of Bech32Encoding address.
The Hledger.Data library allows parsing and querying of C++ ledger-style journal files. It generally provides a compatible subset of C++ ledger's functionality. This package re-exports all the Hledger.Data.* modules (except UTF8, which requires an explicit import.)
data