Copyright | (c) Universiteit Utrecht 2010-2011 University of Oxford 2012-2014 |
---|---|
License | see libraries/base/LICENSE |
Maintainer | [email protected] |
Stability | internal |
Portability | non-portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
If you're using GHC.Generics
, you should consider using the http://hackage.haskell.org/package/generic-deriving package, which contains many useful generic functions.
Since: base-4.6.0.0
Datatype-generic functions are based on the idea of converting values of a datatype T
into corresponding values of a (nearly) isomorphic type Rep T
. The type Rep T
is built from a limited set of type constructors, all provided by this module. A datatype-generic function is then an overloaded function with instances for most of these type constructors, together with a wrapper that performs the mapping between T
and Rep T
. By using this technique, we merely need a few generic instances in order to implement functionality that works for any representable type.
Representable types are collected in the Generic
class, which defines the associated type Rep
as well as conversion functions from
and to
. Typically, you will not define Generic
instances by hand, but have the compiler derive them for you.
The key to defining your own datatype-generic functions is to understand how to represent datatypes using the given set of type constructors.
Let us look at an example first:
data Tree a = Leaf a | Node (Tree a) (Tree a) deriving Generic
The above declaration (which requires the language pragma DeriveGeneric
) causes the following representation to be generated:
instance Generic (Tree a) where type Rep (Tree a) = D1 ('MetaData "Tree" "Main" "package-name" 'False) (C1 ('MetaCons "Leaf" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 a)) :+: C1 ('MetaCons "Node" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Tree a)) :*: S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 (Tree a)))) ...
Hint: You can obtain information about the code being generated from GHC by passing the -ddump-deriv
flag. In GHCi, you can expand a type family such as Rep
using the :kind!
command.
This is a lot of information! However, most of it is actually merely meta-information that makes names of datatypes and constructors and more available on the type level.
Here is a reduced representation for Tree
with nearly all meta-information removed, for now keeping only the most essential aspects:
instance Generic (Tree a) where type Rep (Tree a) = Rec0 a :+: (Rec0 (Tree a) :*: Rec0 (Tree a))
The Tree
datatype has two constructors. The representation of individual constructors is combined using the binary type constructor :+:
.
The first constructor consists of a single field, which is the parameter a
. This is represented as Rec0 a
.
The second constructor consists of two fields. Each is a recursive field of type Tree a
, represented as Rec0 (Tree a)
. Representations of individual fields are combined using the binary type constructor :*:
.
Now let us explain the additional tags being used in the complete representation:
S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness
'DecidedLazy)
tag indicates several things. The 'Nothing
indicates that there is no record field selector associated with this field of the constructor (if there were, it would have been marked 'Just
"recordName"
instead). The other types contain meta-information on the field's strictness:{-# UNPACK #-}
or {-# NOUNPACK #-}
annotation in the source, so it is tagged with 'NoSourceUnpackedness
.!
) or laziness (~
) annotation in the source, so it is tagged with 'NoSourceStrictness
.'DecidedLazy
. Bear in mind that what the compiler decides may be quite different from what is written in the source. See DecidedStrictness
for a more detailed explanation.The 'MetaSel
type is also an instance of the type class Selector
, which can be used to obtain information about the field at the value level.
C1 ('MetaCons "Leaf" 'PrefixI 'False)
and C1 ('MetaCons "Node" 'PrefixI 'False)
invocations indicate that the enclosed part is the representation of the first and second constructor of datatype Tree
, respectively. Here, the meta-information regarding constructor names, fixity and whether it has named fields or not is encoded at the type level. The 'MetaCons
type is also an instance of the type class Constructor
. This type class can be used to obtain information about the constructor at the value level.D1 ('MetaData "Tree" "Main" "package-name" 'False)
tag indicates that the enclosed part is the representation of the datatype Tree
. Again, the meta-information is encoded at the type level. The 'MetaData
type is an instance of class Datatype
, which can be used to obtain the name of a datatype, the module it has been defined in, the package it is located under, and whether it has been defined using data
or newtype
at the value level.There are many datatype-generic functions that do not distinguish between positions that are parameters or positions that are recursive calls. There are also many datatype-generic functions that do not care about the names of datatypes and constructors at all. To keep the number of cases to consider in generic functions in such a situation to a minimum, it turns out that many of the type constructors introduced above are actually synonyms, defining them to be variants of a smaller set of constructors.
K1
The type constructor Rec0
is a variant of K1
:
type Rec0 = K1 R
Here, R
is a type-level proxy that does not have any associated values.
There used to be another variant of K1
(namely Par0
), but it has since been deprecated.
M1
The type constructors S1
, C1
and D1
are all variants of M1
:
type S1 = M1 S type C1 = M1 C type D1 = M1 D
The types S
, C
and D
are once again type-level proxies, just used to create several variants of M1
.
Next to K1
, M1
, :+:
and :*:
there are a few more type constructors that occur in the representations of other datatypes.
V1
For empty datatypes, V1
is used as a representation. For example,
data Empty deriving Generic
yields
instance Generic Empty where type Rep Empty = D1 ('MetaData "Empty" "Main" "package-name" 'False) V1
U1
If a constructor has no arguments, then U1
is used as its representation. For example the representation of Bool
is
instance Generic Bool where type Rep Bool = D1 ('MetaData "Bool" "Data.Bool" "package-name" 'False) (C1 ('MetaCons "False" 'PrefixI 'False) U1 :+: C1 ('MetaCons "True" 'PrefixI 'False) U1)
As :+:
and :*:
are just binary operators, one might ask what happens if the datatype has more than two constructors, or a constructor with more than two fields. The answer is simple: the operators are used several times, to combine all the constructors and fields as needed. However, users /should not rely on a specific nesting strategy/ for :+:
and :*:
being used. The compiler is free to choose any nesting it prefers. (In practice, the current implementation tries to produce a more-or-less balanced nesting, so that the traversal of the structure of the datatype from the root to a particular component can be performed in logarithmic rather than linear time.)
A datatype-generic function comprises two parts:
Generic
, performs the conversion between the original value and its Rep
-based representation and then invokes the generic instances.As an example, let us look at a function encode
that produces a naive, but lossless bit encoding of values of various datatypes. So we are aiming to define a function
encode :: Generic a => a -> [Bool]
where we use Bool
as our datatype for bits.
For part 1, we define a class Encode'
. Perhaps surprisingly, this class is parameterized over a type constructor f
of kind * -> *
. This is a technicality: all the representation type constructors operate with kind * -> *
as base kind. But the type argument is never being used. This may be changed at some point in the future. The class has a single method, and we use the type we want our final function to have, but we replace the occurrences of the generic type argument a
with f p
(where the p
is any argument; it will not be used).
class Encode' f where encode' :: f p -> [Bool]
With the goal in mind to make encode
work on Tree
and other datatypes, we now define instances for the representation type constructors V1
, U1
, :+:
, :*:
, K1
, and M1
.
In order to be able to do this, we need to know the actual definitions of these types:
data V1 p -- lifted version of Empty data U1 p = U1 -- lifted version of () data (:+:) f g p = L1 (f p) | R1 (g p) -- lifted version of Either data (:*:) f g p = (f p) :*: (g p) -- lifted version of (,) newtype K1 i c p = K1 { unK1 :: c } -- a container for a c newtype M1 i t f p = M1 { unM1 :: f p } -- a wrapper
So, U1
is just the unit type, :+:
is just a binary choice like Either
, :*:
is a binary pair like the pair constructor (,)
, and K1
is a value of a specific type c
, and M1
wraps a value of the generic type argument, which in the lifted world is an f p
(where we do not care about p
).
The instance for V1
is slightly awkward (but also rarely used):
instance Encode' V1 where encode' x = undefined
There are no values of type V1 p
to pass (except undefined), so this is actually impossible. One can ask why it is useful to define an instance for V1
at all in this case? Well, an empty type can be used as an argument to a non-empty type, and you might still want to encode the resulting type. As a somewhat contrived example, consider [Empty]
, which is not an empty type, but contains just the empty list. The V1
instance ensures that we can call the generic function on such types.
There is exactly one value of type U1
, so encoding it requires no knowledge, and we can use zero bits:
instance Encode' U1 where encode' U1 = []
In the case for :+:
, we produce False
or True
depending on whether the constructor of the value provided is located on the left or on the right:
instance (Encode' f, Encode' g) => Encode' (f :+: g) where encode' (L1 x) = False : encode' x encode' (R1 x) = True : encode' x
(Note that this encoding strategy may not be reliable across different versions of GHC. Recall that the compiler is free to choose any nesting of :+:
it chooses, so if GHC chooses (a :+: b) :+: c
, then the encoding for a
would be [False, False]
, b
would be [False, True]
, and c
would be [True]
. However, if GHC chooses a :+: (b :+: c)
, then the encoding for a
would be [False]
, b
would be [True, False]
, and c
would be [True, True]
.)
In the case for :*:
, we append the encodings of the two subcomponents:
instance (Encode' f, Encode' g) => Encode' (f :*: g) where encode' (x :*: y) = encode' x ++ encode' y
The case for K1
is rather interesting. Here, we call the final function encode
that we yet have to define, recursively. We will use another type class Encode
for that function:
instance (Encode c) => Encode' (K1 i c) where encode' (K1 x) = encode x
Note how Par0
and Rec0
both being mapped to K1
allows us to define a uniform instance here.
Similarly, we can define a uniform instance for M1
, because we completely disregard all meta-information:
instance (Encode' f) => Encode' (M1 i t f) where encode' (M1 x) = encode' x
Unlike in K1
, the instance for M1
refers to encode'
, not encode
.
We now define class Encode
for the actual encode
function:
class Encode a where encode :: a -> [Bool] default encode :: (Generic a, Encode' (Rep a)) => a -> [Bool] encode x = encode' (from x)
The incoming x
is converted using from
, then we dispatch to the generic instances using encode'
. We use this as a default definition for encode
. We need the 'default encode' signature because ordinary Haskell default methods must not introduce additional class constraints, but our generic default does.
Defining a particular instance is now as simple as saying
instance (Encode a) => Encode (Tree a)
It is not always required to provide instances for all the generic representation types, but omitting instances restricts the set of datatypes the functions will work for:
:+:
instance is given, the function may still work for empty datatypes or datatypes that have a single constructor, but will fail on datatypes with more than one constructor.:*:
instance is given, the function may still work for datatypes where each constructor has just zero or one field, in particular for enumeration types.K1
instance is given, the function may still work for enumeration types, where no constructor has any fields.V1
instance is given, the function may still work for any datatype that is not empty.U1
instance is given, the function may still work for any datatype where each constructor has at least one field.An M1
instance is always required (but it can just ignore the meta-information, as is the case for encode
above).
Datatype-generic functions as defined above work for a large class of datatypes, including parameterized datatypes. (We have used Tree
as our example above, which is of kind * -> *
.) However, the Generic
class ranges over types of kind *
, and therefore, the resulting generic functions (such as encode
) must be parameterized by a generic type argument of kind *
.
What if we want to define generic classes that range over type constructors (such as Functor
, Traversable
, or Foldable
)?
Generic1
classLike Generic
, there is a class Generic1
that defines a representation Rep1
and conversion functions from1
and to1
, only that Generic1
ranges over types of kind * -> *
. (More generally, it can range over types of kind k -> *
, for any kind k
, if the PolyKinds
extension is enabled. More on this later.) The Generic1
class is also derivable.
The representation Rep1
is ever so slightly different from Rep
. Let us look at Tree
as an example again:
data Tree a = Leaf a | Node (Tree a) (Tree a) deriving Generic1
The above declaration causes the following representation to be generated:
instance Generic1 Tree where type Rep1 Tree = D1 ('MetaData "Tree" "Main" "package-name" 'False) (C1 ('MetaCons "Leaf" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1) :+: C1 ('MetaCons "Node" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 Tree) :*: S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec1 Tree))) ...
The representation reuses D1
, C1
, S1
(and thereby M1
) as well as :+:
and :*:
from Rep
. (This reusability is the reason that we carry around the dummy type argument for kind-*
-types, but there are already enough different names involved without duplicating each of these.)
What's different is that we now use Par1
to refer to the parameter (and that parameter, which used to be a
), is not mentioned explicitly by name anywhere; and we use Rec1
to refer to a recursive use of Tree a
.
* -> *
typesUnlike Rec0
, the Par1
and Rec1
type constructors do not map to K1
. They are defined directly, as follows:
newtype Par1 p = Par1 { unPar1 :: p } -- gives access to parameter p newtype Rec1 f p = Rec1 { unRec1 :: f p } -- a wrapper
In Par1
, the parameter p
is used for the first time, whereas Rec1
simply wraps an application of f
to p
.
Note that K1
(in the guise of Rec0
) can still occur in a Rep1
representation, namely when the datatype has a field that does not mention the parameter.
The declaration
data WithInt a = WithInt Int a deriving Generic1
yields
instance Generic1 WithInt where type Rep1 WithInt = D1 ('MetaData "WithInt" "Main" "package-name" 'False) (C1 ('MetaCons "WithInt" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int) :*: S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1))
If the parameter a
appears underneath a composition of other type constructors, then the representation involves composition, too:
data Rose a = Fork a [Rose a]
yields
instance Generic1 Rose where type Rep1 Rose = D1 ('MetaData "Rose" "Main" "package-name" 'False) (C1 ('MetaCons "Fork" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) Par1 :*: S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) ([] :.: Rec1 Rose)))
where
newtype (:.:) f g p = Comp1 { unComp1 :: f (g p) }
k -> *
typesThe Generic1
class can be generalized to range over types of kind k -> *
, for any kind k
. To do so, derive a Generic1
instance with the PolyKinds
extension enabled. For example, the declaration
data Proxy (a :: k) = Proxy deriving Generic1
yields a slightly different instance depending on whether PolyKinds
is enabled. If compiled without PolyKinds
, then Rep1 Proxy :: * -> *
, but if compiled with PolyKinds
, then Rep1 Proxy :: k -> *
.
If one were to attempt to derive a Generic instance for a datatype with an unlifted argument (for example, Int#
), one might expect the occurrence of the Int#
argument to be marked with Rec0 Int#
. This won't work, though, since Int#
is of an unlifted kind, and Rec0
expects a type of kind *
.
One solution would be to represent an occurrence of Int#
with 'Rec0 Int' instead. With this approach, however, the programmer has no way of knowing whether the Int
is actually an Int#
in disguise.
Instead of reusing Rec0
, a separate data family URec
is used to mark occurrences of common unlifted types:
data family URec a p data instance URec (Ptr ()) p = UAddr { uAddr# :: Addr# } data instance URec Char p = UChar { uChar# :: Char# } data instance URec Double p = UDouble { uDouble# :: Double# } data instance URec Int p = UFloat { uFloat# :: Float# } data instance URec Float p = UInt { uInt# :: Int# } data instance URec Word p = UWord { uWord# :: Word# }
Several type synonyms are provided for convenience:
type UAddr = URec (Ptr ()) type UChar = URec Char type UDouble = URec Double type UFloat = URec Float type UInt = URec Int type UWord = URec Word
The declaration
data IntHash = IntHash Int# deriving Generic
yields
instance Generic IntHash where type Rep IntHash = D1 ('MetaData "IntHash" "Main" "package-name" 'False) (C1 ('MetaCons "IntHash" 'PrefixI 'False) (S1 ('MetaSel 'Nothing 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) UInt))
Currently, only the six unlifted types listed above are generated, but this may be extended to encompass more unlifted types in the future.
Void: used for datatypes without constructors
Generic1 (V1 :: k -> Type) | |
Functor (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Foldable (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => V1 m -> m Source foldMap :: Monoid m => (a -> m) -> V1 a -> m Source foldr :: (a -> b -> b) -> b -> V1 a -> b Source foldr' :: (a -> b -> b) -> b -> V1 a -> b Source foldl :: (b -> a -> b) -> b -> V1 a -> b Source foldl' :: (b -> a -> b) -> b -> V1 a -> b Source foldr1 :: (a -> a -> a) -> V1 a -> a Source foldl1 :: (a -> a -> a) -> V1 a -> a Source elem :: Eq a => a -> V1 a -> Bool Source maximum :: Ord a => V1 a -> a Source minimum :: Ord a => V1 a -> a Source | |
Traversable (V1 :: Type -> Type) | Since: base-4.9.0.0 |
Contravariant (V1 :: Type -> Type) | |
Eq (V1 p) | Since: base-4.9.0.0 |
Data p => Data (V1 p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> V1 p -> c (V1 p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (V1 p) Source toConstr :: V1 p -> Constr Source dataTypeOf :: V1 p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (V1 p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (V1 p)) Source gmapT :: (forall b. Data b => b -> b) -> V1 p -> V1 p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> V1 p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> V1 p -> r Source gmapQ :: (forall d. Data d => d -> u) -> V1 p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> V1 p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> V1 p -> m (V1 p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> V1 p -> m (V1 p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> V1 p -> m (V1 p) Source | |
Ord (V1 p) | Since: base-4.9.0.0 |
Read (V1 p) | Since: base-4.9.0.0 |
Show (V1 p) | Since: base-4.9.0.0 |
Generic (V1 p) | |
Semigroup (V1 p) | Since: base-4.12.0.0 |
type Rep1 (V1 :: k -> Type) | Since: base-4.9.0.0 |
type Rep (V1 p) | Since: base-4.9.0.0 |
Unit: used for constructors without arguments
U1 |
Generic1 (U1 :: k -> Type) | |
Monad (U1 :: Type -> Type) | Since: base-4.9.0.0 |
Functor (U1 :: Type -> Type) | Since: base-4.9.0.0 |
Applicative (U1 :: Type -> Type) | Since: base-4.9.0.0 |
Foldable (U1 :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => U1 m -> m Source foldMap :: Monoid m => (a -> m) -> U1 a -> m Source foldr :: (a -> b -> b) -> b -> U1 a -> b Source foldr' :: (a -> b -> b) -> b -> U1 a -> b Source foldl :: (b -> a -> b) -> b -> U1 a -> b Source foldl' :: (b -> a -> b) -> b -> U1 a -> b Source foldr1 :: (a -> a -> a) -> U1 a -> a Source foldl1 :: (a -> a -> a) -> U1 a -> a Source elem :: Eq a => a -> U1 a -> Bool Source maximum :: Ord a => U1 a -> a Source minimum :: Ord a => U1 a -> a Source | |
Traversable (U1 :: Type -> Type) | Since: base-4.9.0.0 |
MonadPlus (U1 :: Type -> Type) | Since: base-4.9.0.0 |
Alternative (U1 :: Type -> Type) | Since: base-4.9.0.0 |
MonadZip (U1 :: Type -> Type) | Since: base-4.9.0.0 |
Contravariant (U1 :: Type -> Type) | |
Eq (U1 p) | Since: base-4.9.0.0 |
Data p => Data (U1 p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> U1 p -> c (U1 p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (U1 p) Source toConstr :: U1 p -> Constr Source dataTypeOf :: U1 p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (U1 p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (U1 p)) Source gmapT :: (forall b. Data b => b -> b) -> U1 p -> U1 p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> U1 p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> U1 p -> r Source gmapQ :: (forall d. Data d => d -> u) -> U1 p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> U1 p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> U1 p -> m (U1 p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> U1 p -> m (U1 p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> U1 p -> m (U1 p) Source | |
Ord (U1 p) | Since: base-4.7.0.0 |
Read (U1 p) | Since: base-4.9.0.0 |
Show (U1 p) | Since: base-4.9.0.0 |
Generic (U1 p) | |
Semigroup (U1 p) | Since: base-4.12.0.0 |
Monoid (U1 p) | Since: base-4.12.0.0 |
type Rep1 (U1 :: k -> Type) | Since: base-4.9.0.0 |
type Rep (U1 p) | Since: base-4.7.0.0 |
Used for marking occurrences of the parameter
Monad Par1 | Since: base-4.9.0.0 |
Functor Par1 | Since: base-4.9.0.0 |
MonadFix Par1 | Since: base-4.9.0.0 |
Defined in Control.Monad.Fix | |
Applicative Par1 | Since: base-4.9.0.0 |
Foldable Par1 | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => Par1 m -> m Source foldMap :: Monoid m => (a -> m) -> Par1 a -> m Source foldr :: (a -> b -> b) -> b -> Par1 a -> b Source foldr' :: (a -> b -> b) -> b -> Par1 a -> b Source foldl :: (b -> a -> b) -> b -> Par1 a -> b Source foldl' :: (b -> a -> b) -> b -> Par1 a -> b Source foldr1 :: (a -> a -> a) -> Par1 a -> a Source foldl1 :: (a -> a -> a) -> Par1 a -> a Source toList :: Par1 a -> [a] Source length :: Par1 a -> Int Source elem :: Eq a => a -> Par1 a -> Bool Source maximum :: Ord a => Par1 a -> a Source minimum :: Ord a => Par1 a -> a Source | |
Traversable Par1 | Since: base-4.9.0.0 |
MonadZip Par1 | Since: base-4.9.0.0 |
Eq p => Eq (Par1 p) | Since: base-4.7.0.0 |
Data p => Data (Par1 p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Par1 p -> c (Par1 p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Par1 p) Source toConstr :: Par1 p -> Constr Source dataTypeOf :: Par1 p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Par1 p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Par1 p)) Source gmapT :: (forall b. Data b => b -> b) -> Par1 p -> Par1 p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Par1 p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Par1 p -> r Source gmapQ :: (forall d. Data d => d -> u) -> Par1 p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> Par1 p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> Par1 p -> m (Par1 p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Par1 p -> m (Par1 p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Par1 p -> m (Par1 p) Source | |
Ord p => Ord (Par1 p) | Since: base-4.7.0.0 |
Defined in GHC.Generics | |
Read p => Read (Par1 p) | Since: base-4.7.0.0 |
Show p => Show (Par1 p) | Since: base-4.7.0.0 |
Generic (Par1 p) | |
Semigroup p => Semigroup (Par1 p) | Since: base-4.12.0.0 |
Monoid p => Monoid (Par1 p) | Since: base-4.12.0.0 |
Generic1 Par1 | |
type Rep (Par1 p) | Since: base-4.7.0.0 |
Defined in GHC.Generics | |
type Rep1 Par1 | Since: base-4.9.0.0 |
Defined in GHC.Generics |
newtype Rec1 (f :: k -> Type) (p :: k) Source
Recursive calls of kind * -> *
(or kind k -> *
, when PolyKinds
is enabled)
Generic1 (Rec1 f :: k -> Type) | |
Monad f => Monad (Rec1 f) | Since: base-4.9.0.0 |
Functor f => Functor (Rec1 f) | Since: base-4.9.0.0 |
MonadFix f => MonadFix (Rec1 f) | Since: base-4.9.0.0 |
Defined in Control.Monad.Fix | |
Applicative f => Applicative (Rec1 f) | Since: base-4.9.0.0 |
Foldable f => Foldable (Rec1 f) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => Rec1 f m -> m Source foldMap :: Monoid m => (a -> m) -> Rec1 f a -> m Source foldr :: (a -> b -> b) -> b -> Rec1 f a -> b Source foldr' :: (a -> b -> b) -> b -> Rec1 f a -> b Source foldl :: (b -> a -> b) -> b -> Rec1 f a -> b Source foldl' :: (b -> a -> b) -> b -> Rec1 f a -> b Source foldr1 :: (a -> a -> a) -> Rec1 f a -> a Source foldl1 :: (a -> a -> a) -> Rec1 f a -> a Source toList :: Rec1 f a -> [a] Source null :: Rec1 f a -> Bool Source length :: Rec1 f a -> Int Source elem :: Eq a => a -> Rec1 f a -> Bool Source maximum :: Ord a => Rec1 f a -> a Source minimum :: Ord a => Rec1 f a -> a Source | |
Traversable f => Traversable (Rec1 f) | Since: base-4.9.0.0 |
Defined in Data.Traversable | |
MonadPlus f => MonadPlus (Rec1 f) | Since: base-4.9.0.0 |
Alternative f => Alternative (Rec1 f) | Since: base-4.9.0.0 |
MonadZip f => MonadZip (Rec1 f) | Since: base-4.9.0.0 |
Contravariant f => Contravariant (Rec1 f) | |
Eq (f p) => Eq (Rec1 f p) | Since: base-4.7.0.0 |
(Data (f p), Typeable f, Data p) => Data (Rec1 f p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Rec1 f p -> c (Rec1 f p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Rec1 f p) Source toConstr :: Rec1 f p -> Constr Source dataTypeOf :: Rec1 f p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c (Rec1 f p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (Rec1 f p)) Source gmapT :: (forall b. Data b => b -> b) -> Rec1 f p -> Rec1 f p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Rec1 f p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Rec1 f p -> r Source gmapQ :: (forall d. Data d => d -> u) -> Rec1 f p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> Rec1 f p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> Rec1 f p -> m (Rec1 f p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Rec1 f p -> m (Rec1 f p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Rec1 f p -> m (Rec1 f p) Source | |
Ord (f p) => Ord (Rec1 f p) | Since: base-4.7.0.0 |
Defined in GHC.Generics | |
Read (f p) => Read (Rec1 f p) | Since: base-4.7.0.0 |
Show (f p) => Show (Rec1 f p) | Since: base-4.7.0.0 |
Generic (Rec1 f p) | |
Semigroup (f p) => Semigroup (Rec1 f p) | Since: base-4.12.0.0 |
Monoid (f p) => Monoid (Rec1 f p) | Since: base-4.12.0.0 |
type Rep1 (Rec1 f :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (Rec1 f p) | Since: base-4.7.0.0 |
Defined in GHC.Generics |
newtype K1 (i :: Type) c (p :: k) Source
Constants, additional parameters and recursion of kind *
Generic1 (K1 i c :: k -> Type) | |
Bifunctor (K1 i :: Type -> Type -> Type) | Since: base-4.9.0.0 |
Bifoldable (K1 i :: Type -> Type -> Type) | Since: base-4.10.0.0 |
Bitraversable (K1 i :: Type -> Type -> Type) | Since: base-4.10.0.0 |
Defined in Data.Bitraversable Methodsbitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> K1 i a b -> f (K1 i c d) Source | |
Functor (K1 i c :: Type -> Type) | Since: base-4.9.0.0 |
Monoid c => Applicative (K1 i c :: Type -> Type) | Since: base-4.12.0.0 |
Foldable (K1 i c :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => K1 i c m -> m Source foldMap :: Monoid m => (a -> m) -> K1 i c a -> m Source foldr :: (a -> b -> b) -> b -> K1 i c a -> b Source foldr' :: (a -> b -> b) -> b -> K1 i c a -> b Source foldl :: (b -> a -> b) -> b -> K1 i c a -> b Source foldl' :: (b -> a -> b) -> b -> K1 i c a -> b Source foldr1 :: (a -> a -> a) -> K1 i c a -> a Source foldl1 :: (a -> a -> a) -> K1 i c a -> a Source toList :: K1 i c a -> [a] Source null :: K1 i c a -> Bool Source length :: K1 i c a -> Int Source elem :: Eq a => a -> K1 i c a -> Bool Source maximum :: Ord a => K1 i c a -> a Source minimum :: Ord a => K1 i c a -> a Source | |
Traversable (K1 i c :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable | |
Contravariant (K1 i c :: Type -> Type) | |
Eq c => Eq (K1 i c p) | Since: base-4.7.0.0 |
(Typeable i, Data p, Data c) => Data (K1 i c p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c0 (d -> b) -> d -> c0 b) -> (forall g. g -> c0 g) -> K1 i c p -> c0 (K1 i c p) Source gunfold :: (forall b r. Data b => c0 (b -> r) -> c0 r) -> (forall r. r -> c0 r) -> Constr -> c0 (K1 i c p) Source toConstr :: K1 i c p -> Constr Source dataTypeOf :: K1 i c p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c0 (t d)) -> Maybe (c0 (K1 i c p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c0 (t d e)) -> Maybe (c0 (K1 i c p)) Source gmapT :: (forall b. Data b => b -> b) -> K1 i c p -> K1 i c p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> K1 i c p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> K1 i c p -> r Source gmapQ :: (forall d. Data d => d -> u) -> K1 i c p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> K1 i c p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> K1 i c p -> m (K1 i c p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> K1 i c p -> m (K1 i c p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> K1 i c p -> m (K1 i c p) Source | |
Ord c => Ord (K1 i c p) | Since: base-4.7.0.0 |
Defined in GHC.Generics | |
Read c => Read (K1 i c p) | Since: base-4.7.0.0 |
Show c => Show (K1 i c p) | Since: base-4.7.0.0 |
Generic (K1 i c p) | |
Semigroup c => Semigroup (K1 i c p) | Since: base-4.12.0.0 |
Monoid c => Monoid (K1 i c p) | Since: base-4.12.0.0 |
type Rep1 (K1 i c :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (K1 i c p) | Since: base-4.7.0.0 |
Defined in GHC.Generics |
newtype M1 (i :: Type) (c :: Meta) (f :: k -> Type) (p :: k) Source
Meta-information (constructor names, etc.)
Generic1 (M1 i c f :: k -> Type) | |
Monad f => Monad (M1 i c f) | Since: base-4.9.0.0 |
Functor f => Functor (M1 i c f) | Since: base-4.9.0.0 |
MonadFix f => MonadFix (M1 i c f) | Since: base-4.9.0.0 |
Defined in Control.Monad.Fix | |
Applicative f => Applicative (M1 i c f) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
Foldable f => Foldable (M1 i c f) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => M1 i c f m -> m Source foldMap :: Monoid m => (a -> m) -> M1 i c f a -> m Source foldr :: (a -> b -> b) -> b -> M1 i c f a -> b Source foldr' :: (a -> b -> b) -> b -> M1 i c f a -> b Source foldl :: (b -> a -> b) -> b -> M1 i c f a -> b Source foldl' :: (b -> a -> b) -> b -> M1 i c f a -> b Source foldr1 :: (a -> a -> a) -> M1 i c f a -> a Source foldl1 :: (a -> a -> a) -> M1 i c f a -> a Source toList :: M1 i c f a -> [a] Source null :: M1 i c f a -> Bool Source length :: M1 i c f a -> Int Source elem :: Eq a => a -> M1 i c f a -> Bool Source maximum :: Ord a => M1 i c f a -> a Source minimum :: Ord a => M1 i c f a -> a Source | |
Traversable f => Traversable (M1 i c f) | Since: base-4.9.0.0 |
Defined in Data.Traversable | |
MonadPlus f => MonadPlus (M1 i c f) | Since: base-4.9.0.0 |
Alternative f => Alternative (M1 i c f) | Since: base-4.9.0.0 |
MonadZip f => MonadZip (M1 i c f) | Since: base-4.9.0.0 |
Contravariant f => Contravariant (M1 i c f) | |
Eq (f p) => Eq (M1 i c f p) | Since: base-4.7.0.0 |
(Data p, Data (f p), Typeable c, Typeable i, Typeable f) => Data (M1 i c f p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c0 (d -> b) -> d -> c0 b) -> (forall g. g -> c0 g) -> M1 i c f p -> c0 (M1 i c f p) Source gunfold :: (forall b r. Data b => c0 (b -> r) -> c0 r) -> (forall r. r -> c0 r) -> Constr -> c0 (M1 i c f p) Source toConstr :: M1 i c f p -> Constr Source dataTypeOf :: M1 i c f p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c0 (t d)) -> Maybe (c0 (M1 i c f p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c0 (t d e)) -> Maybe (c0 (M1 i c f p)) Source gmapT :: (forall b. Data b => b -> b) -> M1 i c f p -> M1 i c f p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> M1 i c f p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> M1 i c f p -> r Source gmapQ :: (forall d. Data d => d -> u) -> M1 i c f p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> M1 i c f p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> M1 i c f p -> m (M1 i c f p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> M1 i c f p -> m (M1 i c f p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> M1 i c f p -> m (M1 i c f p) Source | |
Ord (f p) => Ord (M1 i c f p) | Since: base-4.7.0.0 |
Defined in GHC.Generics Methodscompare :: M1 i c f p -> M1 i c f p -> Ordering Source (<) :: M1 i c f p -> M1 i c f p -> Bool Source (<=) :: M1 i c f p -> M1 i c f p -> Bool Source (>) :: M1 i c f p -> M1 i c f p -> Bool Source (>=) :: M1 i c f p -> M1 i c f p -> Bool Source | |
Read (f p) => Read (M1 i c f p) | Since: base-4.7.0.0 |
Show (f p) => Show (M1 i c f p) | Since: base-4.7.0.0 |
Generic (M1 i c f p) | |
Semigroup (f p) => Semigroup (M1 i c f p) | Since: base-4.12.0.0 |
Monoid (f p) => Monoid (M1 i c f p) | Since: base-4.12.0.0 |
type Rep1 (M1 i c f :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (M1 i c f p) | Since: base-4.7.0.0 |
Defined in GHC.Generics |
data ((f :: k -> Type) :+: (g :: k -> Type)) (p :: k) infixr 5 Source
Sums: encode choice between constructors
Generic1 (f :+: g :: k -> Type) | |
(Functor f, Functor g) => Functor (f :+: g) | Since: base-4.9.0.0 |
(Foldable f, Foldable g) => Foldable (f :+: g) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => (f :+: g) m -> m Source foldMap :: Monoid m => (a -> m) -> (f :+: g) a -> m Source foldr :: (a -> b -> b) -> b -> (f :+: g) a -> b Source foldr' :: (a -> b -> b) -> b -> (f :+: g) a -> b Source foldl :: (b -> a -> b) -> b -> (f :+: g) a -> b Source foldl' :: (b -> a -> b) -> b -> (f :+: g) a -> b Source foldr1 :: (a -> a -> a) -> (f :+: g) a -> a Source foldl1 :: (a -> a -> a) -> (f :+: g) a -> a Source toList :: (f :+: g) a -> [a] Source null :: (f :+: g) a -> Bool Source length :: (f :+: g) a -> Int Source elem :: Eq a => a -> (f :+: g) a -> Bool Source maximum :: Ord a => (f :+: g) a -> a Source minimum :: Ord a => (f :+: g) a -> a Source | |
(Traversable f, Traversable g) => Traversable (f :+: g) | Since: base-4.9.0.0 |
Defined in Data.Traversable Methodstraverse :: Applicative f0 => (a -> f0 b) -> (f :+: g) a -> f0 ((f :+: g) b) Source sequenceA :: Applicative f0 => (f :+: g) (f0 a) -> f0 ((f :+: g) a) Source mapM :: Monad m => (a -> m b) -> (f :+: g) a -> m ((f :+: g) b) Source sequence :: Monad m => (f :+: g) (m a) -> m ((f :+: g) a) Source | |
(Contravariant f, Contravariant g) => Contravariant (f :+: g) | |
(Eq (f p), Eq (g p)) => Eq ((f :+: g) p) | Since: base-4.7.0.0 |
(Typeable f, Typeable g, Data p, Data (f p), Data (g p)) => Data ((f :+: g) p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> (f :+: g) p -> c ((f :+: g) p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ((f :+: g) p) Source toConstr :: (f :+: g) p -> Constr Source dataTypeOf :: (f :+: g) p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c ((f :+: g) p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ((f :+: g) p)) Source gmapT :: (forall b. Data b => b -> b) -> (f :+: g) p -> (f :+: g) p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> (f :+: g) p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> (f :+: g) p -> r Source gmapQ :: (forall d. Data d => d -> u) -> (f :+: g) p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> (f :+: g) p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> (f :+: g) p -> m ((f :+: g) p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :+: g) p -> m ((f :+: g) p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :+: g) p -> m ((f :+: g) p) Source | |
(Ord (f p), Ord (g p)) => Ord ((f :+: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics Methodscompare :: (f :+: g) p -> (f :+: g) p -> Ordering Source (<) :: (f :+: g) p -> (f :+: g) p -> Bool Source (<=) :: (f :+: g) p -> (f :+: g) p -> Bool Source (>) :: (f :+: g) p -> (f :+: g) p -> Bool Source (>=) :: (f :+: g) p -> (f :+: g) p -> Bool Source | |
(Read (f p), Read (g p)) => Read ((f :+: g) p) | Since: base-4.7.0.0 |
(Show (f p), Show (g p)) => Show ((f :+: g) p) | Since: base-4.7.0.0 |
Generic ((f :+: g) p) | |
type Rep1 (f :+: g :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics type Rep1 (f :+: g :: k -> Type) = D1 (MetaData ":+:" "GHC.Generics" "base" False) (C1 (MetaCons "L1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 f)) :+: C1 (MetaCons "R1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 g))) | |
type Rep ((f :+: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics type Rep ((f :+: g) p) = D1 (MetaData ":+:" "GHC.Generics" "base" False) (C1 (MetaCons "L1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f p))) :+: C1 (MetaCons "R1" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (g p)))) |
data ((f :: k -> Type) :*: (g :: k -> Type)) (p :: k) infixr 6 Source
Products: encode multiple arguments to constructors
(f p) :*: (g p) infixr 6 |
Generic1 (f :*: g :: k -> Type) | |
(Monad f, Monad g) => Monad (f :*: g) | Since: base-4.9.0.0 |
(Functor f, Functor g) => Functor (f :*: g) | Since: base-4.9.0.0 |
(MonadFix f, MonadFix g) => MonadFix (f :*: g) | Since: base-4.9.0.0 |
Defined in Control.Monad.Fix | |
(Applicative f, Applicative g) => Applicative (f :*: g) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
(Foldable f, Foldable g) => Foldable (f :*: g) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => (f :*: g) m -> m Source foldMap :: Monoid m => (a -> m) -> (f :*: g) a -> m Source foldr :: (a -> b -> b) -> b -> (f :*: g) a -> b Source foldr' :: (a -> b -> b) -> b -> (f :*: g) a -> b Source foldl :: (b -> a -> b) -> b -> (f :*: g) a -> b Source foldl' :: (b -> a -> b) -> b -> (f :*: g) a -> b Source foldr1 :: (a -> a -> a) -> (f :*: g) a -> a Source foldl1 :: (a -> a -> a) -> (f :*: g) a -> a Source toList :: (f :*: g) a -> [a] Source null :: (f :*: g) a -> Bool Source length :: (f :*: g) a -> Int Source elem :: Eq a => a -> (f :*: g) a -> Bool Source maximum :: Ord a => (f :*: g) a -> a Source minimum :: Ord a => (f :*: g) a -> a Source | |
(Traversable f, Traversable g) => Traversable (f :*: g) | Since: base-4.9.0.0 |
Defined in Data.Traversable Methodstraverse :: Applicative f0 => (a -> f0 b) -> (f :*: g) a -> f0 ((f :*: g) b) Source sequenceA :: Applicative f0 => (f :*: g) (f0 a) -> f0 ((f :*: g) a) Source mapM :: Monad m => (a -> m b) -> (f :*: g) a -> m ((f :*: g) b) Source sequence :: Monad m => (f :*: g) (m a) -> m ((f :*: g) a) Source | |
(MonadPlus f, MonadPlus g) => MonadPlus (f :*: g) | Since: base-4.9.0.0 |
(Alternative f, Alternative g) => Alternative (f :*: g) | Since: base-4.9.0.0 |
(MonadZip f, MonadZip g) => MonadZip (f :*: g) | Since: base-4.9.0.0 |
(Contravariant f, Contravariant g) => Contravariant (f :*: g) | |
(Eq (f p), Eq (g p)) => Eq ((f :*: g) p) | Since: base-4.7.0.0 |
(Typeable f, Typeable g, Data p, Data (f p), Data (g p)) => Data ((f :*: g) p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> (f :*: g) p -> c ((f :*: g) p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ((f :*: g) p) Source toConstr :: (f :*: g) p -> Constr Source dataTypeOf :: (f :*: g) p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c ((f :*: g) p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ((f :*: g) p)) Source gmapT :: (forall b. Data b => b -> b) -> (f :*: g) p -> (f :*: g) p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> (f :*: g) p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> (f :*: g) p -> r Source gmapQ :: (forall d. Data d => d -> u) -> (f :*: g) p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> (f :*: g) p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> (f :*: g) p -> m ((f :*: g) p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :*: g) p -> m ((f :*: g) p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :*: g) p -> m ((f :*: g) p) Source | |
(Ord (f p), Ord (g p)) => Ord ((f :*: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics Methodscompare :: (f :*: g) p -> (f :*: g) p -> Ordering Source (<) :: (f :*: g) p -> (f :*: g) p -> Bool Source (<=) :: (f :*: g) p -> (f :*: g) p -> Bool Source (>) :: (f :*: g) p -> (f :*: g) p -> Bool Source (>=) :: (f :*: g) p -> (f :*: g) p -> Bool Source | |
(Read (f p), Read (g p)) => Read ((f :*: g) p) | Since: base-4.7.0.0 |
(Show (f p), Show (g p)) => Show ((f :*: g) p) | Since: base-4.7.0.0 |
Generic ((f :*: g) p) | |
(Semigroup (f p), Semigroup (g p)) => Semigroup ((f :*: g) p) | Since: base-4.12.0.0 |
(Monoid (f p), Monoid (g p)) => Monoid ((f :*: g) p) | Since: base-4.12.0.0 |
type Rep1 (f :*: g :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics type Rep1 (f :*: g :: k -> Type) = D1 (MetaData ":*:" "GHC.Generics" "base" False) (C1 (MetaCons ":*:" (InfixI RightAssociative 6) False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 f) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec1 g))) | |
type Rep ((f :*: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics type Rep ((f :*: g) p) = D1 (MetaData ":*:" "GHC.Generics" "base" False) (C1 (MetaCons ":*:" (InfixI RightAssociative 6) False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f p)) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (g p)))) |
newtype ((f :: k2 -> Type) :.: (g :: k1 -> k2)) (p :: k1) infixr 7 Source
Composition of functors
Functor f => Generic1 (f :.: g :: k -> Type) | |
(Functor f, Functor g) => Functor (f :.: g) | Since: base-4.9.0.0 |
(Applicative f, Applicative g) => Applicative (f :.: g) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
(Foldable f, Foldable g) => Foldable (f :.: g) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => (f :.: g) m -> m Source foldMap :: Monoid m => (a -> m) -> (f :.: g) a -> m Source foldr :: (a -> b -> b) -> b -> (f :.: g) a -> b Source foldr' :: (a -> b -> b) -> b -> (f :.: g) a -> b Source foldl :: (b -> a -> b) -> b -> (f :.: g) a -> b Source foldl' :: (b -> a -> b) -> b -> (f :.: g) a -> b Source foldr1 :: (a -> a -> a) -> (f :.: g) a -> a Source foldl1 :: (a -> a -> a) -> (f :.: g) a -> a Source toList :: (f :.: g) a -> [a] Source null :: (f :.: g) a -> Bool Source length :: (f :.: g) a -> Int Source elem :: Eq a => a -> (f :.: g) a -> Bool Source maximum :: Ord a => (f :.: g) a -> a Source minimum :: Ord a => (f :.: g) a -> a Source | |
(Traversable f, Traversable g) => Traversable (f :.: g) | Since: base-4.9.0.0 |
Defined in Data.Traversable Methodstraverse :: Applicative f0 => (a -> f0 b) -> (f :.: g) a -> f0 ((f :.: g) b) Source sequenceA :: Applicative f0 => (f :.: g) (f0 a) -> f0 ((f :.: g) a) Source mapM :: Monad m => (a -> m b) -> (f :.: g) a -> m ((f :.: g) b) Source sequence :: Monad m => (f :.: g) (m a) -> m ((f :.: g) a) Source | |
(Alternative f, Applicative g) => Alternative (f :.: g) | Since: base-4.9.0.0 |
(Functor f, Contravariant g) => Contravariant (f :.: g) | |
Eq (f (g p)) => Eq ((f :.: g) p) | Since: base-4.7.0.0 |
(Typeable f, Typeable g, Data p, Data (f (g p))) => Data ((f :.: g) p) | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g0. g0 -> c g0) -> (f :.: g) p -> c ((f :.: g) p) Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c ((f :.: g) p) Source toConstr :: (f :.: g) p -> Constr Source dataTypeOf :: (f :.: g) p -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c ((f :.: g) p)) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c ((f :.: g) p)) Source gmapT :: (forall b. Data b => b -> b) -> (f :.: g) p -> (f :.: g) p Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> (f :.: g) p -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> (f :.: g) p -> r Source gmapQ :: (forall d. Data d => d -> u) -> (f :.: g) p -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> (f :.: g) p -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> (f :.: g) p -> m ((f :.: g) p) Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :.: g) p -> m ((f :.: g) p) Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> (f :.: g) p -> m ((f :.: g) p) Source | |
Ord (f (g p)) => Ord ((f :.: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics Methodscompare :: (f :.: g) p -> (f :.: g) p -> Ordering Source (<) :: (f :.: g) p -> (f :.: g) p -> Bool Source (<=) :: (f :.: g) p -> (f :.: g) p -> Bool Source (>) :: (f :.: g) p -> (f :.: g) p -> Bool Source (>=) :: (f :.: g) p -> (f :.: g) p -> Bool Source | |
Read (f (g p)) => Read ((f :.: g) p) | Since: base-4.7.0.0 |
Show (f (g p)) => Show ((f :.: g) p) | Since: base-4.7.0.0 |
Generic ((f :.: g) p) | |
Semigroup (f (g p)) => Semigroup ((f :.: g) p) | Since: base-4.12.0.0 |
Monoid (f (g p)) => Monoid ((f :.: g) p) | Since: base-4.12.0.0 |
type Rep1 (f :.: g :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep ((f :.: g) p) | Since: base-4.7.0.0 |
Defined in GHC.Generics |
data family URec (a :: Type) (p :: k) Source
Constants of unlifted kinds
Since: base-4.9.0.0
Generic1 (URec Word :: k -> Type) | |
Generic1 (URec Int :: k -> Type) | |
Generic1 (URec Float :: k -> Type) | |
Generic1 (URec Double :: k -> Type) | |
Generic1 (URec Char :: k -> Type) | |
Generic1 (URec (Ptr ()) :: k -> Type) | |
Functor (URec Char :: Type -> Type) | Since: base-4.9.0.0 |
Functor (URec Double :: Type -> Type) | Since: base-4.9.0.0 |
Functor (URec Float :: Type -> Type) | Since: base-4.9.0.0 |
Functor (URec Int :: Type -> Type) | Since: base-4.9.0.0 |
Functor (URec Word :: Type -> Type) | Since: base-4.9.0.0 |
Functor (URec (Ptr ()) :: Type -> Type) | Since: base-4.9.0.0 |
Foldable (URec Char :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => URec Char m -> m Source foldMap :: Monoid m => (a -> m) -> URec Char a -> m Source foldr :: (a -> b -> b) -> b -> URec Char a -> b Source foldr' :: (a -> b -> b) -> b -> URec Char a -> b Source foldl :: (b -> a -> b) -> b -> URec Char a -> b Source foldl' :: (b -> a -> b) -> b -> URec Char a -> b Source foldr1 :: (a -> a -> a) -> URec Char a -> a Source foldl1 :: (a -> a -> a) -> URec Char a -> a Source toList :: URec Char a -> [a] Source null :: URec Char a -> Bool Source length :: URec Char a -> Int Source elem :: Eq a => a -> URec Char a -> Bool Source maximum :: Ord a => URec Char a -> a Source minimum :: Ord a => URec Char a -> a Source | |
Foldable (URec Double :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => URec Double m -> m Source foldMap :: Monoid m => (a -> m) -> URec Double a -> m Source foldr :: (a -> b -> b) -> b -> URec Double a -> b Source foldr' :: (a -> b -> b) -> b -> URec Double a -> b Source foldl :: (b -> a -> b) -> b -> URec Double a -> b Source foldl' :: (b -> a -> b) -> b -> URec Double a -> b Source foldr1 :: (a -> a -> a) -> URec Double a -> a Source foldl1 :: (a -> a -> a) -> URec Double a -> a Source toList :: URec Double a -> [a] Source null :: URec Double a -> Bool Source length :: URec Double a -> Int Source elem :: Eq a => a -> URec Double a -> Bool Source maximum :: Ord a => URec Double a -> a Source minimum :: Ord a => URec Double a -> a Source | |
Foldable (URec Float :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => URec Float m -> m Source foldMap :: Monoid m => (a -> m) -> URec Float a -> m Source foldr :: (a -> b -> b) -> b -> URec Float a -> b Source foldr' :: (a -> b -> b) -> b -> URec Float a -> b Source foldl :: (b -> a -> b) -> b -> URec Float a -> b Source foldl' :: (b -> a -> b) -> b -> URec Float a -> b Source foldr1 :: (a -> a -> a) -> URec Float a -> a Source foldl1 :: (a -> a -> a) -> URec Float a -> a Source toList :: URec Float a -> [a] Source null :: URec Float a -> Bool Source length :: URec Float a -> Int Source elem :: Eq a => a -> URec Float a -> Bool Source maximum :: Ord a => URec Float a -> a Source minimum :: Ord a => URec Float a -> a Source | |
Foldable (URec Int :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => URec Int m -> m Source foldMap :: Monoid m => (a -> m) -> URec Int a -> m Source foldr :: (a -> b -> b) -> b -> URec Int a -> b Source foldr' :: (a -> b -> b) -> b -> URec Int a -> b Source foldl :: (b -> a -> b) -> b -> URec Int a -> b Source foldl' :: (b -> a -> b) -> b -> URec Int a -> b Source foldr1 :: (a -> a -> a) -> URec Int a -> a Source foldl1 :: (a -> a -> a) -> URec Int a -> a Source toList :: URec Int a -> [a] Source null :: URec Int a -> Bool Source length :: URec Int a -> Int Source elem :: Eq a => a -> URec Int a -> Bool Source maximum :: Ord a => URec Int a -> a Source minimum :: Ord a => URec Int a -> a Source | |
Foldable (URec Word :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => URec Word m -> m Source foldMap :: Monoid m => (a -> m) -> URec Word a -> m Source foldr :: (a -> b -> b) -> b -> URec Word a -> b Source foldr' :: (a -> b -> b) -> b -> URec Word a -> b Source foldl :: (b -> a -> b) -> b -> URec Word a -> b Source foldl' :: (b -> a -> b) -> b -> URec Word a -> b Source foldr1 :: (a -> a -> a) -> URec Word a -> a Source foldl1 :: (a -> a -> a) -> URec Word a -> a Source toList :: URec Word a -> [a] Source null :: URec Word a -> Bool Source length :: URec Word a -> Int Source elem :: Eq a => a -> URec Word a -> Bool Source maximum :: Ord a => URec Word a -> a Source minimum :: Ord a => URec Word a -> a Source | |
Foldable (URec (Ptr ()) :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Foldable Methodsfold :: Monoid m => URec (Ptr ()) m -> m Source foldMap :: Monoid m => (a -> m) -> URec (Ptr ()) a -> m Source foldr :: (a -> b -> b) -> b -> URec (Ptr ()) a -> b Source foldr' :: (a -> b -> b) -> b -> URec (Ptr ()) a -> b Source foldl :: (b -> a -> b) -> b -> URec (Ptr ()) a -> b Source foldl' :: (b -> a -> b) -> b -> URec (Ptr ()) a -> b Source foldr1 :: (a -> a -> a) -> URec (Ptr ()) a -> a Source foldl1 :: (a -> a -> a) -> URec (Ptr ()) a -> a Source toList :: URec (Ptr ()) a -> [a] Source null :: URec (Ptr ()) a -> Bool Source length :: URec (Ptr ()) a -> Int Source elem :: Eq a => a -> URec (Ptr ()) a -> Bool Source maximum :: Ord a => URec (Ptr ()) a -> a Source minimum :: Ord a => URec (Ptr ()) a -> a Source | |
Traversable (URec Char :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable | |
Traversable (URec Double :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable Methodstraverse :: Applicative f => (a -> f b) -> URec Double a -> f (URec Double b) Source sequenceA :: Applicative f => URec Double (f a) -> f (URec Double a) Source mapM :: Monad m => (a -> m b) -> URec Double a -> m (URec Double b) Source sequence :: Monad m => URec Double (m a) -> m (URec Double a) Source | |
Traversable (URec Float :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable Methodstraverse :: Applicative f => (a -> f b) -> URec Float a -> f (URec Float b) Source sequenceA :: Applicative f => URec Float (f a) -> f (URec Float a) Source mapM :: Monad m => (a -> m b) -> URec Float a -> m (URec Float b) Source sequence :: Monad m => URec Float (m a) -> m (URec Float a) Source | |
Traversable (URec Int :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable | |
Traversable (URec Word :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable | |
Traversable (URec (Ptr ()) :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Traversable Methodstraverse :: Applicative f => (a -> f b) -> URec (Ptr ()) a -> f (URec (Ptr ()) b) Source sequenceA :: Applicative f => URec (Ptr ()) (f a) -> f (URec (Ptr ()) a) Source mapM :: Monad m => (a -> m b) -> URec (Ptr ()) a -> m (URec (Ptr ()) b) Source sequence :: Monad m => URec (Ptr ()) (m a) -> m (URec (Ptr ()) a) Source | |
Eq (URec Word p) | Since: base-4.9.0.0 |
Eq (URec Int p) | Since: base-4.9.0.0 |
Eq (URec Float p) | |
Eq (URec Double p) | Since: base-4.9.0.0 |
Eq (URec Char p) | Since: base-4.9.0.0 |
Eq (URec (Ptr ()) p) | Since: base-4.9.0.0 |
Ord (URec Word p) | Since: base-4.9.0.0 |
Defined in GHC.Generics Methodscompare :: URec Word p -> URec Word p -> Ordering Source (<) :: URec Word p -> URec Word p -> Bool Source (<=) :: URec Word p -> URec Word p -> Bool Source (>) :: URec Word p -> URec Word p -> Bool Source (>=) :: URec Word p -> URec Word p -> Bool Source | |
Ord (URec Int p) | Since: base-4.9.0.0 |
Defined in GHC.Generics Methodscompare :: URec Int p -> URec Int p -> Ordering Source (<) :: URec Int p -> URec Int p -> Bool Source (<=) :: URec Int p -> URec Int p -> Bool Source (>) :: URec Int p -> URec Int p -> Bool Source (>=) :: URec Int p -> URec Int p -> Bool Source | |
Ord (URec Float p) | |
Defined in GHC.Generics Methodscompare :: URec Float p -> URec Float p -> Ordering Source (<) :: URec Float p -> URec Float p -> Bool Source (<=) :: URec Float p -> URec Float p -> Bool Source (>) :: URec Float p -> URec Float p -> Bool Source (>=) :: URec Float p -> URec Float p -> Bool Source | |
Ord (URec Double p) | Since: base-4.9.0.0 |
Defined in GHC.Generics Methodscompare :: URec Double p -> URec Double p -> Ordering Source (<) :: URec Double p -> URec Double p -> Bool Source (<=) :: URec Double p -> URec Double p -> Bool Source (>) :: URec Double p -> URec Double p -> Bool Source (>=) :: URec Double p -> URec Double p -> Bool Source max :: URec Double p -> URec Double p -> URec Double p Source min :: URec Double p -> URec Double p -> URec Double p Source | |
Ord (URec Char p) | Since: base-4.9.0.0 |
Defined in GHC.Generics Methodscompare :: URec Char p -> URec Char p -> Ordering Source (<) :: URec Char p -> URec Char p -> Bool Source (<=) :: URec Char p -> URec Char p -> Bool Source (>) :: URec Char p -> URec Char p -> Bool Source (>=) :: URec Char p -> URec Char p -> Bool Source | |
Ord (URec (Ptr ()) p) | Since: base-4.9.0.0 |
Defined in GHC.Generics Methodscompare :: URec (Ptr ()) p -> URec (Ptr ()) p -> Ordering Source (<) :: URec (Ptr ()) p -> URec (Ptr ()) p -> Bool Source (<=) :: URec (Ptr ()) p -> URec (Ptr ()) p -> Bool Source (>) :: URec (Ptr ()) p -> URec (Ptr ()) p -> Bool Source (>=) :: URec (Ptr ()) p -> URec (Ptr ()) p -> Bool Source max :: URec (Ptr ()) p -> URec (Ptr ()) p -> URec (Ptr ()) p Source min :: URec (Ptr ()) p -> URec (Ptr ()) p -> URec (Ptr ()) p Source | |
Show (URec Word p) | Since: base-4.9.0.0 |
Show (URec Int p) | Since: base-4.9.0.0 |
Show (URec Float p) | |
Show (URec Double p) | Since: base-4.9.0.0 |
Show (URec Char p) | Since: base-4.9.0.0 |
Generic (URec Word p) | |
Generic (URec Int p) | |
Generic (URec Float p) | |
Generic (URec Double p) | |
Generic (URec Char p) | |
Generic (URec (Ptr ()) p) | |
data URec Word (p :: k) |
Used for marking occurrences of Since: base-4.9.0.0 |
data URec Int (p :: k) |
Used for marking occurrences of Since: base-4.9.0.0 |
data URec Float (p :: k) |
Used for marking occurrences of Since: base-4.9.0.0 |
data URec Double (p :: k) |
Used for marking occurrences of Since: base-4.9.0.0 |
data URec Char (p :: k) |
Used for marking occurrences of Since: base-4.9.0.0 |
data URec (Ptr ()) (p :: k) |
Used for marking occurrences of Since: base-4.9.0.0 |
type Rep1 (URec Word :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep1 (URec Int :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep1 (URec Float :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep1 (URec Double :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep1 (URec Char :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep1 (URec (Ptr ()) :: k -> Type) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (URec Word p) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (URec Int p) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (URec Float p) | |
Defined in GHC.Generics | |
type Rep (URec Double p) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (URec Char p) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
type Rep (URec (Ptr ()) p) | Since: base-4.9.0.0 |
Defined in GHC.Generics |
type UAddr = URec (Ptr ()) Source
Since: base-4.9.0.0
Since: base-4.9.0.0
type UDouble = URec Double Source
Since: base-4.9.0.0
type UFloat = URec Float Source
Since: base-4.9.0.0
Since: base-4.9.0.0
Since: base-4.9.0.0
Type synonym for encoding recursion (of kind Type
)
Tag for K1: recursion (of kind Type
)
Type synonym for encoding meta-information for datatypes
Type synonym for encoding meta-information for constructors
Type synonym for encoding meta-information for record selectors
Tag for M1: datatype
Tag for M1: constructor
Tag for M1: record selector
Class for datatypes that represent datatypes
datatypeName :: t d (f :: k -> Type) (a :: k) -> [Char] Source
The name of the datatype (unqualified)
moduleName :: t d (f :: k -> Type) (a :: k) -> [Char] Source
The fully-qualified name of the module where the type is declared
packageName :: t d (f :: k -> Type) (a :: k) -> [Char] Source
The package name of the module where the type is declared
Since: base-4.9.0.0
isNewtype :: t d (f :: k -> Type) (a :: k) -> Bool Source
Marks if the datatype is actually a newtype
Since: base-4.7.0.0
(KnownSymbol n, KnownSymbol m, KnownSymbol p, SingI nt) => Datatype (MetaData n m p nt :: Meta) | Since: base-4.9.0.0 |
Defined in GHC.Generics |
class Constructor c where Source
Class for datatypes that represent data constructors
conName :: t c (f :: k -> Type) (a :: k) -> [Char] Source
The name of the constructor
conFixity :: t c (f :: k -> Type) (a :: k) -> Fixity Source
The fixity of the constructor
conIsRecord :: t c (f :: k -> Type) (a :: k) -> Bool Source
Marks if this constructor is a record
(KnownSymbol n, SingI f, SingI r) => Constructor (MetaCons n f r :: Meta) | Since: base-4.9.0.0 |
Class for datatypes that represent records
selName :: t s (f :: k -> Type) (a :: k) -> [Char] Source
The name of the selector
selSourceUnpackedness :: t s (f :: k -> Type) (a :: k) -> SourceUnpackedness Source
The selector's unpackedness annotation (if any)
Since: base-4.9.0.0
selSourceStrictness :: t s (f :: k -> Type) (a :: k) -> SourceStrictness Source
The selector's strictness annotation (if any)
Since: base-4.9.0.0
selDecidedStrictness :: t s (f :: k -> Type) (a :: k) -> DecidedStrictness Source
The strictness that the compiler inferred for the selector
Since: base-4.9.0.0
(SingI mn, SingI su, SingI ss, SingI ds) => Selector (MetaSel mn su ss ds :: Meta) | Since: base-4.9.0.0 |
Defined in GHC.Generics MethodsselName :: t (MetaSel mn su ss ds) f a -> [Char] Source selSourceUnpackedness :: t (MetaSel mn su ss ds) f a -> SourceUnpackedness Source selSourceStrictness :: t (MetaSel mn su ss ds) f a -> SourceStrictness Source selDecidedStrictness :: t (MetaSel mn su ss ds) f a -> DecidedStrictness Source |
Datatype to represent the fixity of a constructor. An infix | declaration directly corresponds to an application of Infix
.
Prefix | |
Infix Associativity Int |
Eq Fixity | Since: base-4.6.0.0 |
Data Fixity | Since: base-4.9.0.0 |
Defined in Data.Data Methodsgfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Fixity -> c Fixity Source gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c Fixity Source toConstr :: Fixity -> Constr Source dataTypeOf :: Fixity -> DataType Source dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c Fixity) Source dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c Fixity) Source gmapT :: (forall b. Data b => b -> b) -> Fixity -> Fixity Source gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Fixity -> r Source gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Fixity -> r Source gmapQ :: (forall d. Data d => d -> u) -> Fixity -> [u] Source gmapQi :: Int -> (forall d. Data d => d -> u) -> Fixity -> u Source gmapM :: Monad m => (forall d. Data d => d -> m d) -> Fixity -> m Fixity Source gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Fixity -> m Fixity Source gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Fixity -> m Fixity Source | |
Ord Fixity | Since: base-4.6.0.0 |
Defined in GHC.Generics | |
Read Fixity | Since: base-4.6.0.0 |
Show Fixity | Since: base-4.6.0.0 |
Generic Fixity | |
type Rep Fixity | Since: base-4.7.0.0 |
Defined in GHC.Generics type Rep Fixity = D1 (MetaData "Fixity" "GHC.Generics" "base" False) (C1 (MetaCons "Prefix" PrefixI False) (U1 :: Type -> Type) :+: C1 (MetaCons "Infix" PrefixI False) (S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Associativity) :*: S1 (MetaSel (Nothing :: Maybe Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 Int))) |
This variant of Fixity
appears at the type level.
Since: base-4.9.0.0
PrefixI | |
InfixI Associativity Nat |
data Associativity Source
Datatype to represent the associativity of a constructor
LeftAssociative | |
RightAssociative | |
NotAssociative |
Get the precedence of a fixity value.
data SourceUnpackedness Source
The unpackedness of a field as the user wrote it in the source code. For example, in the following data type:
data E = ExampleConstructor Int {-# NOUNPACK #-} Int {-# UNPACK #-} Int
The fields of ExampleConstructor
have NoSourceUnpackedness
, SourceNoUnpack
, and SourceUnpack
, respectively.
Since: base-4.9.0.0
NoSourceUnpackedness | |
SourceNoUnpack | |
SourceUnpack |
data SourceStrictness Source
The strictness of a field as the user wrote it in the source code. For example, in the following data type:
data E = ExampleConstructor Int ~Int !Int
The fields of ExampleConstructor
have NoSourceStrictness
, SourceLazy
, and SourceStrict
, respectively.
Since: base-4.9.0.0
NoSourceStrictness | |
SourceLazy | |
SourceStrict |
data DecidedStrictness Source
The strictness that GHC infers for a field during compilation. Whereas there are nine different combinations of SourceUnpackedness
and SourceStrictness
, the strictness that GHC decides will ultimately be one of lazy, strict, or unpacked. What GHC decides is affected both by what the user writes in the source code and by GHC flags. As an example, consider this data type:
data E = ExampleConstructor {-# UNPACK #-} !Int !Int Int
ExampleConstructor
will have DecidedStrict
, DecidedStrict
, and DecidedLazy
, respectively.-XStrictData
enabled, then the fields will have DecidedStrict
, DecidedStrict
, and DecidedStrict
, respectively.-O2
enabled, then the fields will have DecidedUnpack
, DecidedStrict
, and DecidedLazy
, respectively.Since: base-4.9.0.0
DecidedLazy | |
DecidedStrict | |
DecidedUnpack |
Datatype to represent metadata associated with a datatype (MetaData
), constructor (MetaCons
), or field selector (MetaSel
).
MetaData n m p nt
, n
is the datatype's name, m
is the module in which the datatype is defined, p
is the package in which the datatype is defined, and nt
is 'True
if the datatype is a newtype
.MetaCons n f s
, n
is the constructor's name, f
is its fixity, and s
is 'True
if the constructor contains record selectors.MetaSel mn su ss ds
, if the field uses record syntax, then mn
is Just
the record name. Otherwise, mn
is Nothing
. su
and ss
are the field's unpackedness and strictness annotations, and ds
is the strictness that GHC infers for the field.Since: base-4.9.0.0
MetaData Symbol Symbol Symbol Bool | |
MetaCons Symbol FixityI Bool | |
MetaSel (Maybe Symbol) SourceUnpackedness SourceStrictness DecidedStrictness |
(KnownSymbol n, SingI f, SingI r) => Constructor (MetaCons n f r :: Meta) | Since: base-4.9.0.0 |
(KnownSymbol n, KnownSymbol m, KnownSymbol p, SingI nt) => Datatype (MetaData n m p nt :: Meta) | Since: base-4.9.0.0 |
Defined in GHC.Generics | |
(SingI mn, SingI su, SingI ss, SingI ds) => Selector (MetaSel mn su ss ds :: Meta) | Since: base-4.9.0.0 |
Defined in GHC.Generics MethodsselName :: t (MetaSel mn su ss ds) f a -> [Char] Source selSourceUnpackedness :: t (MetaSel mn su ss ds) f a -> SourceUnpackedness Source selSourceStrictness :: t (MetaSel mn su ss ds) f a -> SourceStrictness Source selDecidedStrictness :: t (MetaSel mn su ss ds) f a -> DecidedStrictness Source |
Representable types of kind *
. This class is derivable in GHC with the DeriveGeneric
flag on.
A Generic
instance must satisfy the following laws:
from . to ≡ id to . from ≡ id
Convert from the datatype to its representation
Convert from the representation to the datatype
class Generic1 (f :: k -> Type) where Source
Representable types of kind * -> *
(or kind k -> *
, when PolyKinds
is enabled). This class is derivable in GHC with the DeriveGeneric
flag on.
A Generic1
instance must satisfy the following laws:
from1 . to1 ≡ id to1 . from1 ≡ id
from1 :: f a -> Rep1 f a Source
Convert from the datatype to its representation
Convert from the representation to the datatype
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.6.1/docs/html/libraries/base-4.12.0.0/GHC-Generics.html