generics-sop-0.2.5.0: Generic Programming using True Sums of Products

Safe Haskell | Safe
Language | Haskell2010

Generics.SOP.BasicFunctors

Contents

- Basic functors
- Mapping functions

Description

Basic functors.

Definitions of the type-level equivalents of `const`, `id`, and (`.`), and a definition of the lifted function space.

These datatypes are generally useful, but in this library, they're primarily used as parameters for the `NP`, `NS`, `POP`, and `SOP` types.

We define own variants of `Const`, `Identity` and `Compose` for various reasons.

- `Const` and `Compose` become kind polymorphic only in `base-4.9.0.0` (`transformers-0.5.0.0`).
- Shorter names are convenient, and pattern synonyms aren't (yet) powerful enough, particularly exhaustiveness check doesn't work properly. See https://ghc.haskell.org/trac/ghc/ticket/8779.

Synopsis

- newtype K a b = K a
- unK :: K a b -> a
- newtype I a = I a
- unI :: I a -> a
- newtype (f :.: g) p = Comp (f (g p))
- unComp :: (f :.: g) p -> f (g p)
- mapII :: (a -> b) -> I a -> I b
- mapIK :: (a -> b) -> I a -> K b c
- mapKI :: (a -> b) -> K a c -> I b
- mapKK :: (a -> b) -> K a c -> K b d
- mapIII :: (a -> b -> c) -> I a -> I b -> I c
- mapIIK :: (a -> b -> c) -> I a -> I b -> K c d
- mapIKI :: (a -> b -> c) -> I a -> K b d -> I c
- mapIKK :: (a -> b -> c) -> I a -> K b d -> K c e
- mapKII :: (a -> b -> c) -> K a d -> I b -> I c
- mapKIK :: (a -> b -> c) -> K a d -> I b -> K c e
- mapKKI :: (a -> b -> c) -> K a d -> K b e -> I c
- mapKKK :: (a -> b -> c) -> K a d -> K b e -> K c f

# Basic functors

newtype K a b #

The constant type functor.

Like `Constant`, but kind-polymorphic in its second argument and with a shorter name.

Constructors

K a |

Instances

Eq2 (K *) # | Since: 0.2.4.0
Methods liftEq2 :: (a -> b -> Bool) -> (c -> d -> Bool) -> K * a c -> K * b d -> Bool #
Ord2 (K *) # | Since: 0.2.4.0
Methods liftCompare2 :: (a -> b -> Ordering) -> (c -> d -> Ordering) -> K * a c -> K * b d -> Ordering #
Read2 (K *) # | Since: 0.2.4.0
Methods liftReadsPrec2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> Int -> ReadS (K * a b) # liftReadList2 :: (Int -> ReadS a) -> ReadS [a] -> (Int -> ReadS b) -> ReadS [b] -> ReadS [K * a b] #
Show2 (K *) # | Since: 0.2.4.0
Methods liftShowsPrec2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> (Int -> b -> ShowS) -> ([b] -> ShowS) -> Int -> K * a b -> ShowS # liftShowList2 :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> (Int -> b -> ShowS) -> ([b] -> ShowS) -> [K * a b] -> ShowS #
Functor (K * a) # |
Methods fmap :: (a -> b) -> K * a a -> K * a b # (<$) :: a -> K * a b -> K * a a #
Monoid a => Applicative (K * a) # |
Methods pure :: a -> K * a a # (<*>) :: K * a (a -> b) -> K * a a -> K * a b # (*>) :: K * a a -> K * a b -> K * a b # (<*) :: K * a a -> K * a b -> K * a a #
Foldable (K * a) # |
Methods fold :: Monoid m => K * a m -> m # foldMap :: Monoid m => (a -> m) -> K * a a -> m # foldr :: (a -> b -> b) -> b -> K * a a -> b # foldr' :: (a -> b -> b) -> b -> K * a a -> b # foldl :: (b -> a -> b) -> b -> K * a a -> b # foldl' :: (b -> a -> b) -> b -> K * a a -> b # foldr1 :: (a -> a -> a) -> K * a a -> a # foldl1 :: (a -> a -> a) -> K * a a -> a # toList :: K * a a -> [a] # null :: K * a a -> Bool # length :: K * a a -> Int # elem :: Eq a => a -> K * a a -> Bool # maximum :: Ord a => K * a a -> a # minimum :: Ord a => K * a a -> a # sum :: Num a => K * a a -> a # product :: Num a => K * a a -> a #
Traversable (K * a) # |
Methods traverse :: Applicative f => (a -> f b) -> K * a a -> f (K * a b) # sequenceA :: Applicative f => K * a (f a) -> f (K * a a) # mapM :: Monad m => (a -> m b) -> K * a a -> m (K * a b) # sequence :: Monad m => K * a (m a) -> m (K * a a) #
Eq a => Eq1 (K * a) # | Since: 0.2.4.0
Methods liftEq :: (a -> b -> Bool) -> K * a a -> K * a b -> Bool #
Ord a => Ord1 (K * a) # | Since: 0.2.4.0
Methods liftCompare :: (a -> b -> Ordering) -> K * a a -> K * a b -> Ordering #
Read a => Read1 (K * a) # | Since: 0.2.4.0
Methods liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (K * a a) # liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [K * a a] #
Show a => Show1 (K * a) # | Since: 0.2.4.0
Methods liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> K * a a -> ShowS # liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [K * a a] -> ShowS #
Eq a => Eq (K k a b) # |
Methods (==) :: K k a b -> K k a b -> Bool # (/=) :: K k a b -> K k a b -> Bool #
Ord a => Ord (K k a b) # |
Methods compare :: K k a b -> K k a b -> Ordering # (<) :: K k a b -> K k a b -> Bool # (<=) :: K k a b -> K k a b -> Bool # (>) :: K k a b -> K k a b -> Bool # (>=) :: K k a b -> K k a b -> Bool # max :: K k a b -> K k a b -> K k a b # min :: K k a b -> K k a b -> K k a b #
Read a => Read (K k a b) # |
Methods readsPrec :: Int -> ReadS (K k a b) # readList :: ReadS [K k a b] # readPrec :: ReadPrec (K k a b) # readListPrec :: ReadPrec [K k a b] #
Show a => Show (K k a b) # |
Methods showsPrec :: Int -> K k a b -> ShowS # show :: K k a b -> String # showList :: [K k a b] -> ShowS #
Generic (K k a b) # |
Associated Types type Rep (K k a b) :: * -> * # Methods from :: K k a b -> Rep (K k a b) x # to :: Rep (K k a b) x -> K k a b #
NFData a => NFData (K k a b) # | Since: 0.2.5.0
Methods rnf :: K k a b -> () #
type Rep (K k a b) # |
type Rep (K k a b) = D1 (MetaData "K" "Generics.SOP.BasicFunctors" "generics-sop-0.2.5.0-12lxo1SLuajA6W53awQMOK" True) (C1 (MetaCons "K" PrefixI False) (S1 (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a)))
type Code (K * a0 b0) # |
type Code (K * a0 b0) = (:) [*] ((:) * a0 ([] *)) ([] [*])

unK :: K a b -> a #

Extract the contents of a `K` value.

newtype I a #

The identity type functor.

Like `Identity`, but with a shorter name.

Constructors

I a |

Instances

Monad I # |
Methods (>>=) :: I a -> (a -> I b) -> I b # (>>) :: I a -> I b -> I b # return :: a -> I a # fail :: String -> I a #
Functor I # |
Methods fmap :: (a -> b) -> I a -> I b # (<$) :: a -> I b -> I a #
Applicative I # |
Methods pure :: a -> I a # (<*>) :: I (a -> b) -> I a -> I b # (*>) :: I a -> I b -> I b # (<*) :: I a -> I b -> I a #
Foldable I # |
Methods fold :: Monoid m => I m -> m # foldMap :: Monoid m => (a -> m) -> I a -> m # foldr :: (a -> b -> b) -> b -> I a -> b # foldr' :: (a -> b -> b) -> b -> I a -> b # foldl :: (b -> a -> b) -> b -> I a -> b # foldl' :: (b -> a -> b) -> b -> I a -> b # foldr1 :: (a -> a -> a) -> I a -> a # foldl1 :: (a -> a -> a) -> I a -> a # toList :: I a -> [a] # null :: I a -> Bool # length :: I a -> Int # elem :: Eq a => a -> I a -> Bool # maximum :: Ord a => I a -> a # minimum :: Ord a => I a -> a # sum :: Num a => I a -> a # product :: Num a => I a -> a #
Traversable I # |
Methods traverse :: Applicative f => (a -> f b) -> I a -> f (I b) # sequenceA :: Applicative f => I (f a) -> f (I a) # mapM :: Monad m => (a -> m b) -> I a -> m (I b) # sequence :: Monad m => I (m a) -> m (I a) #
Eq1 I # | Since: 0.2.4.0
Methods liftEq :: (a -> b -> Bool) -> I a -> I b -> Bool #
Ord1 I # | Since: 0.2.4.0
Methods liftCompare :: (a -> b -> Ordering) -> I a -> I b -> Ordering #
Read1 I # | Since: 0.2.4.0
Methods liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS (I a) # liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [I a] #
Show1 I # | Since: 0.2.4.0
Methods liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> I a -> ShowS # liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [I a] -> ShowS #
Eq a => Eq (I a) # |
Methods (==) :: I a -> I a -> Bool # (/=) :: I a -> I a -> Bool #
Ord a => Ord (I a) # |
Methods compare :: I a -> I a -> Ordering # (<) :: I a -> I a -> Bool # (<=) :: I a -> I a -> Bool # (>) :: I a -> I a -> Bool # (>=) :: I a -> I a -> Bool # max :: I a -> I a -> I a # min :: I a -> I a -> I a #
Read a => Read (I a) # |
Methods readsPrec :: Int -> ReadS (I a) # readList :: ReadS [I a] # readPrec :: ReadPrec (I a) # readListPrec :: ReadPrec [I a] #
Show a => Show (I a) # |
Methods showsPrec :: Int -> I a -> ShowS # show :: I a -> String # showList :: [I a] -> ShowS #
Generic (I a) # |
Associated Types type Rep (I a) :: * -> * # Methods from :: I a -> Rep (I a) x # to :: Rep (I a) x -> I a #
NFData a => NFData (I a) # | Since: 0.2.5.0
Methods rnf :: I a -> () #
type Rep (I a) # |
type Rep (I a) = D1 (MetaData "I" "Generics.SOP.BasicFunctors" "generics-sop-0.2.5.0-12lxo1SLuajA6W53awQMOK" True) (C1 (MetaCons "I" PrefixI False) (S1 (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 a)))
type Code (I a0) # |
type Code (I a0) = (:) [*] ((:) * a0 ([] *)) ([] [*])

unI :: I a -> a #

Extract the contents of an `I` value.

newtype (f :.: g) p infixr 7 #

Composition of functors.

Like `Compose`, but kind-polymorphic and with a shorter name.

Constructors

Comp (f (g p)) |

Instances

(Functor f, Functor g) => Functor ((:.:) * * f g) # |
Methods fmap :: (a -> b) -> (* :.: *) f g a -> (* :.: *) f g b # (<$) :: a -> (* :.: *) f g b -> (* :.: *) f g a #
(Applicative f, Applicative g) => Applicative ((:.:) * * f g) # | Since: 0.2.5.0
Methods pure :: a -> (* :.: *) f g a # (<*>) :: (* :.: *) f g (a -> b) -> (* :.: *) f g a -> (* :.: *) f g b # (*>) :: (* :.: *) f g a -> (* :.: *) f g b -> (* :.: *) f g b # (<*) :: (* :.: *) f g a -> (* :.: *) f g b -> (* :.: *) f g a #
(Foldable f, Foldable g) => Foldable ((:.:) * * f g) # | Since: 0.2.5.0
Methods fold :: Monoid m => (* :.: *) f g m -> m # foldMap :: Monoid m => (a -> m) -> (* :.: *) f g a -> m # foldr :: (a -> b -> b) -> b -> (* :.: *) f g a -> b # foldr' :: (a -> b -> b) -> b -> (* :.: *) f g a -> b # foldl :: (b -> a -> b) -> b -> (* :.: *) f g a -> b # foldl' :: (b -> a -> b) -> b -> (* :.: *) f g a -> b # foldr1 :: (a -> a -> a) -> (* :.: *) f g a -> a # foldl1 :: (a -> a -> a) -> (* :.: *) f g a -> a # toList :: (* :.: *) f g a -> [a] # null :: (* :.: *) f g a -> Bool # length :: (* :.: *) f g a -> Int # elem :: Eq a => a -> (* :.: *) f g a -> Bool # maximum :: Ord a => (* :.: *) f g a -> a # minimum :: Ord a => (* :.: *) f g a -> a # sum :: Num a => (* :.: *) f g a -> a # product :: Num a => (* :.: *) f g a -> a #
(Traversable f, Traversable g) => Traversable ((:.:) * * f g) # | Since: 0.2.5.0
Methods traverse :: Applicative f => (a -> f b) -> (* :.: *) f g a -> f ((* :.: *) f g b) # sequenceA :: Applicative f => (* :.: *) f g (f a) -> f ((* :.: *) f g a) # mapM :: Monad m => (a -> m b) -> (* :.: *) f g a -> m ((* :.: *) f g b) # sequence :: Monad m => (* :.: *) f g (m a) -> m ((* :.: *) f g a) #
(Eq1 f, Eq1 g) => Eq1 ((:.:) * * f g) # | Since: 0.2.4.0
Methods liftEq :: (a -> b -> Bool) -> (* :.: *) f g a -> (* :.: *) f g b -> Bool #
(Ord1 f, Ord1 g) => Ord1 ((:.:) * * f g) # | Since: 0.2.4.0
Methods liftCompare :: (a -> b -> Ordering) -> (* :.: *) f g a -> (* :.: *) f g b -> Ordering #
(Read1 f, Read1 g) => Read1 ((:.:) * * f g) # | Since: 0.2.4.0
Methods liftReadsPrec :: (Int -> ReadS a) -> ReadS [a] -> Int -> ReadS ((* :.: *) f g a) # liftReadList :: (Int -> ReadS a) -> ReadS [a] -> ReadS [(* :.: *) f g a] #
(Show1 f, Show1 g) => Show1 ((:.:) * * f g) # | Since: 0.2.4.0
Methods liftShowsPrec :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> Int -> (* :.: *) f g a -> ShowS # liftShowList :: (Int -> a -> ShowS) -> ([a] -> ShowS) -> [(* :.: *) f g a] -> ShowS #
(Eq1 f, Eq1 g, Eq a) => Eq ((:.:) * * f g a) # |
Methods (==) :: (* :.: *) f g a -> (* :.: *) f g a -> Bool # (/=) :: (* :.: *) f g a -> (* :.: *) f g a -> Bool #
(Ord1 f, Ord1 g, Ord a) => Ord ((:.:) * * f g a) # |
Methods compare :: (* :.: *) f g a -> (* :.: *) f g a -> Ordering # (<) :: (* :.: *) f g a -> (* :.: *) f g a -> Bool # (<=) :: (* :.: *) f g a -> (* :.: *) f g a -> Bool # (>) :: (* :.: *) f g a -> (* :.: *) f g a -> Bool # (>=) :: (* :.: *) f g a -> (* :.: *) f g a -> Bool # max :: (* :.: *) f g a -> (* :.: *) f g a -> (* :.: *) f g a # min :: (* :.: *) f g a -> (* :.: *) f g a -> (* :.: *) f g a #
(Read1 f, Read1 g, Read a) => Read ((:.:) * * f g a) # |
Methods readsPrec :: Int -> ReadS ((* :.: *) f g a) # readList :: ReadS [(* :.: *) f g a] # readPrec :: ReadPrec ((* :.: *) f g a) # readListPrec :: ReadPrec [(* :.: *) f g a] #
(Show1 f, Show1 g, Show a) => Show ((:.:) * * f g a) # |
Methods showsPrec :: Int -> (* :.: *) f g a -> ShowS # show :: (* :.: *) f g a -> String # showList :: [(* :.: *) f g a] -> ShowS #
Generic ((:.:) k l f g p) # |
Associated Types type Rep ((:.:) k l f g p) :: * -> * # Methods from :: (k :.: l) f g p -> Rep ((k :.: l) f g p) x # to :: Rep ((k :.: l) f g p) x -> (k :.: l) f g p #
NFData (f (g a)) => NFData ((:.:) k l f g a) # | Since: 0.2.5.0
Methods rnf :: (k :.: l) f g a -> () #
type Rep ((:.:) k l f g p) # |
type Rep ((:.:) k l f g p) = D1 (MetaData ":.:" "Generics.SOP.BasicFunctors" "generics-sop-0.2.5.0-12lxo1SLuajA6W53awQMOK" True) (C1 (MetaCons "Comp" PrefixI False) (S1 (MetaSel (Nothing Symbol) NoSourceUnpackedness NoSourceStrictness DecidedLazy) (Rec0 (f (g p)))))
type Code ((:.:) * * f0 g0 p0) # |
type Code ((:.:) * * f0 g0 p0) = (:) [*] ((:) * (f0 (g0 p0)) ([] *)) ([] [*])

unComp :: (f :.: g) p -> f (g p) #

Extract the contents of a `Comp` value.

# Mapping functions

mapII :: (a -> b) -> I a -> I b #

Lift the given function.

Since: 0.2.5.0

mapIK :: (a -> b) -> I a -> K b c #

Lift the given function.

Since: 0.2.5.0

mapKI :: (a -> b) -> K a c -> I b #

Lift the given function.

Since: 0.2.5.0

mapKK :: (a -> b) -> K a c -> K b d #

Lift the given function.

Since: 0.2.5.0

mapIII :: (a -> b -> c) -> I a -> I b -> I c #

Lift the given function.

Since: 0.2.5.0

mapIIK :: (a -> b -> c) -> I a -> I b -> K c d #

Lift the given function.

Since: 0.2.5.0

mapIKI :: (a -> b -> c) -> I a -> K b d -> I c #

Lift the given function.

Since: 0.2.5.0

mapIKK :: (a -> b -> c) -> I a -> K b d -> K c e #

Lift the given function.

Since: 0.2.5.0

mapKII :: (a -> b -> c) -> K a d -> I b -> I c #

Lift the given function.

Since: 0.2.5.0

mapKIK :: (a -> b -> c) -> K a d -> I b -> K c e #

Lift the given function.

Since: 0.2.5.0

mapKKI :: (a -> b -> c) -> K a d -> K b e -> I c #

Lift the given function.

Since: 0.2.5.0

mapKKK :: (a -> b -> c) -> K a d -> K b e -> K c f #

Lift the given function.

Since: 0.2.5.0