-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Tools for functors from Hask^k to Hask -- -- Tools for functors from Hask^k to Hask @package conkin @version 1.0.2 -- | The Conkin module defines tools for types of kind (k -- -> *) -> * (continuation kind types), -- treating them as functors from the category of types of kind k -- -> * (Hask^k) to the category of types of kind -- * (Hask). -- -- It defines its own Functor, Applicative, -- Foldable, and Traversable classes, as continuation kind -- types are kind-incompatible with the homonymous classes in -- Prelude. -- -- The Dispose type lifts a traditional functor to a continuation -- kind functor: -- --
--   >>> :k Dispose Maybe 0
--   Dispose Maybe 0 :: (Nat -> *) -> *
--   
-- -- While the Coyoneda type does the opposite. -- --
--   >>> data OfSymbol a = OfSymbol (a "hello")
--   
--   >>> :k OfSymbol
--   OfSymbol :: (Symbol -> *) -> *
--   
--   >>> :k Coyoneda OfSymbol
--   Coyoneda OfSymbol :: * -> *
--   
-- -- Two of the most useful functions provided by the module are -- align and apportion, as they allow you to transpose the -- composition of a traditional endofunctor and a continuation kind -- functor. -- --
--   >>> rows = zipWith (\ch ix -> Pair (Identity ch, Identity ix)) "abc" [0..2]
--   
--   >>> rows
--   [ Pair { getPair = ( Identity 'a' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 2 ) }
--   ]
--   
--   >>> cols = align rows
--   
--   >>> cols
--   Pair { getPair = ( "abc" , [ 0 , 1 , 2 ] ) }
--   
--   >>> apportion cols
--   [ Pair { getPair = ( Identity 'a' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'a' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'a' , Identity 2 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 2 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 2 ) }
--   ]
--   
--   >>> apportion $ fmap ZipList cols
--   ZipList
--     { getZipList = 
--         [ Pair { getPair = ( Identity 'a' , Identity 0 ) }
--         , Pair { getPair = ( Identity 'b' , Identity 1 ) }
--         , Pair { getPair = ( Identity 'c' , Identity 2 ) }
--         ]
--     }
--   
-- -- There's also convenience types for Products and -- Coproducts of continuation kind functors, as well as for -- Tuples and Tagged unions of arbitrary types. module Conkin -- | A functor from Hask^k to Hask, an analogue of -- Functor for kind (k -> *) -> * class Functor (f :: (k -> *) -> *) fmap :: Functor f => (forall (x :: k). a x -> b x) -> f a -> f b -- | An analogue of <$> for use with Conkin's -- Functor (<$>) :: Functor f => (forall x. a x -> b x) -> f a -> f b infixl 4 <$> -- | An analogue of Applicative for kind (k -> *) -> -- * class Functor f => Applicative (f :: (k -> *) -> *) pure :: Applicative f => (forall (x :: k). a x) -> f a (<*>) :: Applicative f => f (a ~> b) -> f a -> f b -- | arrows in Hask^k have type a ~> b :: k -> * newtype (~>) (a :: k -> *) (b :: k -> *) (x :: k) Arrow :: (a x -> b x) -> (~>) [~$~] :: (~>) -> a x -> b x -- | An analogue of liftA2 for use with Conkin's -- Applicative liftA2 :: Applicative f => (forall x. a x -> b x -> c x) -> f a -> f b -> f c -- | An analogue of liftA3 for use with Conkin's -- Applicative liftA3 :: Applicative f => (forall x. a x -> b x -> c x -> d x) -> f a -> f b -> f c -> f d -- | An extension of liftA3 to functions of four arguments liftA4 :: Applicative f => (forall x. a x -> b x -> c x -> d x -> e x) -> f a -> f b -> f c -> f d -> f e -- | An analogue of Foldable for kind (k -> *) -> * class Foldable (t :: (k -> *) -> *) where foldr f b ta = foldMap (Endo . f) ta `appEndo` b foldMap f = foldr (\ ax b -> f ax <> b) mempty foldr :: Foldable t => (forall (x :: k). a x -> b -> b) -> b -> t a -> b foldMap :: (Foldable t, Monoid m) => (forall (x :: k). a x -> m) -> t a -> m -- | An analogue of Traversable for kind (k -> *) -> -- * class (Foldable t, Functor t) => Traversable (t :: (i -> *) -> *) where traverse f = sequenceA . fmap (Compose . f) sequenceA = traverse getCompose traverse :: forall (f :: (j -> *) -> *) (a :: i -> *) (b :: i -> j -> *). (Traversable t, Applicative f) => (forall x. a x -> f (b x)) -> t a -> f (Compose t (Flip b)) sequenceA :: forall (f :: (j -> *) -> *) (a :: i -> j -> *). (Traversable t, Applicative f) => t (Compose f a) -> f (Compose t (Flip a)) -- | version of traverse that unflips the inner type traverse' :: (Traversable t, Applicative f) => (forall x. a x -> f (Flip b x)) -> t a -> f (Compose t b) -- | version of sequenceA that unflips the inner type sequenceA' :: (Traversable t, Applicative f) => t (Compose f (Flip a)) -> f (Compose t a) -- | sequenceA helper for single-parameter constructors -- --
--   >>> :{
--   data OfOne a = OfOne (a Int)
--   instance Functor OfOne where
--     fmap h (OfOne a) = OfOne (h a)
--   instance Applicative OfOne where
--     pure = OfOne
--     OfOne f <*> OfOne a = OfOne (f ~$~ a)
--   instance Foldable OfOne where
--     foldMap h (OfOne a) = h a
--   instance Traversable OfOne where
--     sequenceA (OfOne fa) = liftT1 OfOne fa
--   :}
--   
liftT1 :: Applicative g => (forall h. h w -> f h) -> Compose g a w -> g (Compose f (Flip a)) -- | sequenceA helper for two-parameter constructors -- --
--   >>> :{
--   data OfTwo a = OfTwo (a Int) (a Char)
--   instance Functor OfTwo where
--     fmap h (OfTwo ai ac) = OfTwo (h ai) (h ac)
--   instance Applicative OfTwo where
--     pure a = OfTwo a a
--     OfTwo fi fc <*> OfTwo ai ac = OfTwo (fi ~$~ ai) (fc ~$~ ac)
--   instance Foldable OfTwo where
--     foldMap h (OfTwo ai ac) = h ai <> h ac
--   instance Traversable OfTwo where
--     sequenceA (OfTwo fai fac) = liftT2 OfTwo fai fac
--   :}
--   
liftT2 :: Applicative g => (forall h. h w -> h x -> f h) -> Compose g a w -> Compose g a x -> g (Compose f (Flip a)) -- | sequenceA helper for three-parameter constructors -- --
--   >>> :{
--   data OfThree a = OfThree (a Int) (a Char) (a Bool)
--   instance Functor OfThree where
--     fmap h (OfThree ai ac ab) = OfThree (h ai) (h ac) (h ab)
--   instance Applicative OfThree where
--     pure a = OfThree a a a
--     OfThree fi fc fb <*> OfThree ai ac ab = OfThree (fi ~$~ ai) (fc ~$~ ac) (fb ~$~ ab)
--   instance Foldable OfThree where
--     foldMap h (OfThree ai ac ab) = h ai <> h ac <> h ab
--   instance Traversable OfThree where
--     sequenceA (OfThree fai fac fab) = liftT3 OfThree fai fac fab
--   :}
--   
liftT3 :: Applicative g => (forall h. h w -> h x -> h y -> f h) -> Compose g a w -> Compose g a x -> Compose g a y -> g (Compose f (Flip a)) -- | sequenceA helper for four-parameter constructors -- --
--   >>> :{
--   data OfFour a = OfFour (a Int) (a Char) (a Bool) (a Double)
--   instance Functor OfFour where
--     fmap h (OfFour ai ac ab ad) = OfFour (h ai) (h ac) (h ab) (h ad)
--   instance Applicative OfFour where
--     pure a = OfFour a a a a
--     OfFour fi fc fb fd <*> OfFour ai ac ab ad = OfFour (fi ~$~ ai) (fc ~$~ ac) (fb ~$~ ab) (fd ~$~ ad)
--   instance Foldable OfFour where
--     foldMap h (OfFour ai ac ab ad) = h ai <> h ac <> h ab <> h ad
--   instance Traversable OfFour where
--     sequenceA (OfFour fai fac fab fad) = liftT4 OfFour fai fac fab fad
--   :}
--   
liftT4 :: Applicative g => (forall h. h w -> h x -> h y -> h z -> f h) -> Compose g a w -> Compose g a x -> Compose g a y -> Compose g a z -> g (Compose f (Flip a)) -- | Loosely, align transforms an array of structures into a -- structure of arrays, if by "array" one means an arbitrary collection -- type. -- --
--   >>> rows = zipWith (\ch ix -> Pair (Identity ch, Identity ix)) "abc" [0..2]
--   
--   >>> rows
--   [ Pair { getPair = ( Identity 'a' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 2 ) }
--   ]
--   
--   >>> align rows
--   Pair { getPair = ( "abc" , [ 0 , 1 , 2 ] ) }
--   
align :: (Traversable f, Applicative g) => f (g Identity) -> g f -- | Loosely, apportion transforms a structure of arrays into an -- array of structures, if by "array" one means an arbitrary collection -- type. -- -- Depending on the collection's Applicative instance, this may or -- may not be the inverse of align. -- --
--   >>> cols = Pair { getPair = ( "abc" , [ 0 , 1 , 2 ] ) }
--   
--   >>> apportion cols
--   [ Pair { getPair = ( Identity 'a' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'a' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'a' , Identity 2 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'b' , Identity 2 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 0 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 1 ) }
--   , Pair { getPair = ( Identity 'c' , Identity 2 ) }
--   ]
--   
--   >>> apportion $ fmap ZipList cols
--   ZipList
--     { getZipList = 
--         [ Pair { getPair = ( Identity 'a' , Identity 0 ) }
--         , Pair { getPair = ( Identity 'b' , Identity 1 ) }
--         , Pair { getPair = ( Identity 'c' , Identity 2 ) }
--         ]
--     }
--   
apportion :: (Applicative f, Traversable g) => g f -> f (g Identity) -- | If f is a functor from Hask to Hask, then, -- forall (x :: k). Dispose f x is a functor from Hask^k -- to Hask -- -- The name comes from the isomorphism Dispose f ~ Flip (Compose f) -- :: k -> (k -> *) -> *, as a pun off the latin prefixes -- "com-", meaning together, and "dis-", meaning apart. newtype Dispose (f :: * -> *) (x :: k) (a :: k -> *) Dispose :: f (a x) -> Dispose [getDispose] :: Dispose -> f (a x) -- | If t is a functor from Hask^k to Hask, then -- Coyoneda t is a functor from Hask to Hask. -- -- It's very similar to the Coyoneda from the -- kan-extensions package, differing only in kind, and -- Coyoneda t a is isomorphic to t (Const a) for any -- Functor. data Coyoneda (t :: (k -> *) -> *) (u :: *) [Coyoneda] :: (forall x. a x -> u) -> t a -> Coyoneda t u -- | convert a functor from its Coyoneda representation getCoyoneda :: Functor t => Coyoneda t a -> t (Const a) -- | convert a functor to its Coyoneda representation toCoyoneda :: t (Const a) -> Coyoneda t a -- | The product of two continuation kind functors is a continuation kind -- functor. -- --
--   >>> data A z where A :: Int -> [x] -> [y] -> A '(x,y)
--   
--   >>> data B z where B :: [(x,y)] -> B '(x,y)
--   
--   >>> foo = Product . Pure . Compose . Pure . Curry $ A 0 "abc" [True, False]
--   
--   >>> :t foo
--   foo :: Product (Pure Char) (Pure Bool) A
--   
--   >>> a2b :: A z -> B z ; a2b (A _ xs ys) = B $ zip xs ys
--   
--   >>> :t fmap a2b foo
--   fmap a2b foo :: Product (Pure Char) (Pure Bool) B
--   
newtype Product (f :: (i -> *) -> *) (g :: (j -> *) -> *) (a :: (i, j) -> *) Product :: f (Compose g (Curry a)) -> Product [getProduct] :: Product -> f (Compose g (Curry a)) -- | helper to make a Product when the inner type is already -- curried. -- --
--   >>> comma = Pure . Compose . Pure $ ('a', True)
--   
--   >>> :t comma
--   comma :: Pure Char (Compose (Pure Bool) (,))
--   
--   >>> :t toProduct UncurryStrict comma
--   toProduct UncurryStrict comma
--     :: Product (Pure Char) (Pure Bool) (Uncurry (,))
--   
toProduct :: (Functor f, Functor g) => (forall x y. a x y -> b '(x, y)) -> f (Compose g a) -> Product f g b -- | helper to unwrap a Product when the inner type is already -- curried. -- --
--   >>> comma' = toProduct UncurryStrict . Pure . Compose . Pure $ ('a', True)
--   
--   >>> :t comma'
--   comma' :: Product (Pure Char) (Pure Bool) (Uncurry (,))
--   
--   >>> :t getProduct comma'
--   getProduct comma'
--     :: Pure Char (Compose (Pure Bool) (Curry (Uncurry (,))))
--   
--   >>> :t fromProduct getUncurryStrict comma'
--   fromProduct getUncurryStrict comma'
--     :: Pure Char (Compose (Pure Bool) (,))
--   
fromProduct :: (Functor f, Functor g) => (forall x y. b '(x, y) -> a x y) -> Product f g b -> f (Compose g a) -- | The coproduct of two continuation kind functors is a continuation kind -- functor. -- --
--   >>> data A z where { AL :: i -> A ('Left i) ; AR :: j -> A ('Right j) }
--   
--   >>> data B z where { BL :: i -> i -> B ('Left i) ; BR :: B ('Right j) }
--   
--   >>> bar = Coproduct (Pure . Compose $ AL True, Pure . Compose $ AR 'a')
--   
--   >>> :t bar
--   bar :: Coproduct (Pure Bool) (Pure Char) A
--   
--   >>> a2b :: A z -> B z ; a2b (AL i) = BL i i ; a2b (AR _) = BR
--   
--   >>> :t fmap a2b bar
--   fmap a2b bar :: Coproduct (Pure Bool) (Pure Char) B
--   
newtype Coproduct (f :: (i -> *) -> *) (g :: (j -> *) -> *) (a :: Either i j -> *) Coproduct :: (f (Compose a Left), g (Compose a Right)) -> Coproduct [getCoproduct] :: Coproduct -> (f (Compose a Left), g (Compose a Right)) -- | A continuation kind functor for pairs. -- --
--   >>> :t Pair (Identity True, Identity 'a')
--   Pair (Identity True, Identity 'a') :: Pair Bool Char Identity
--   
newtype Pair (x0 :: k) (x1 :: k) (a :: k -> *) Pair :: (a x0, a x1) -> Pair [getPair] :: Pair -> (a x0, a x1) -- | A continuation kind functor for tuples of arbitrary length. -- --
--   >>> :t Identity True `Cons` Identity 'a' `Cons` Nil
--   Identity True `Cons` Identity 'a' `Cons` Nil
--     :: Tuple '[Bool, Char] Identity
--   
data Tuple (xs :: [k]) (a :: k -> *) [Nil] :: Tuple '[] a [Cons] :: a x -> !(Tuple xs a) -> Tuple (x : xs) a -- | A continuation kind functor for tagged unions -- --
--   >>> :t [ Here (Identity True), There $ Here (Identity 'a') ]
--   [ Here (Identity True), There $ Here (Identity 'a') ]
--     :: [Tagged (Bool : Char : xs) Identity]
--   
data Tagged (xs :: [k]) (a :: k -> *) [Here] :: a x -> Tagged (x : xs) a [There] :: !(Tagged xs a) -> Tagged (x : xs) a -- | a type-level version of flip, it's used in the definition of -- traverse and sequenceA as a way to reverse the order in -- which parameters are passed. -- -- Flip (Flip a) is isomorphic to Identity a -- --
--   >>> :t Flip . Flip
--   Flip . Flip :: a y x -> Flip (Flip a) y x
--   
--   >>> :t getFlip . getFlip
--   getFlip . getFlip :: Flip (Flip a) x y -> a x y
--   
newtype Flip (a :: i -> j -> *) (y :: j) (x :: i) Flip :: a x y -> Flip [getFlip] :: Flip -> a x y -- | a type-level version of curry, it's used to convert between -- types of kind (i,j) -> * and types of kind i -> j -- -> * newtype Curry (a :: (i, j) -> *) (x :: i) (y :: j) Curry :: a '(x, y) -> Curry [getCurry] :: Curry -> a '(x, y) -- | A type-level version of uncurry, it's used to convert between -- types of kind i -> j -> * and types of kind (i,j) -- -> *. newtype Uncurry (a :: i -> j -> *) (z :: (i, j)) -- | The UncurryLazy constructor is useful when you need to -- construct/destruct an Uncurry a z value without placing -- restrictions on z -- --
--   >>> :t (\(UncurryLazy axy) -> UncurryLazy axy) :: Uncurry a z -> Uncurry a z
--   (\(UncurryLazy axy) -> UncurryLazy axy) :: Uncurry a z -> Uncurry a z
--     :: Uncurry a z -> Uncurry a z
--   
--   >>> import Data.Tuple (swap)
--   
--   >>> :t (\(UncurryLazy axy) -> UncurryLazy $ Flip $ swap axy) :: Uncurry (,) z -> Uncurry (Flip (,)) z
--   (\(UncurryLazy axy) -> UncurryLazy $ Flip $ swap axy) :: Uncurry (,) z -> Uncurry (Flip (,)) z
--     :: Uncurry (,) z -> Uncurry (Flip (,)) z
--   
-- -- It is slightly finnicky, and doesn't work well with function -- composition (i.e. .), and requires more hints from the -- compiler. -- --
--   >>> :t (UncurryLazy . getUncurryLazy) :: Uncurry a z -> Uncurry a z
--   
--   <interactive>:1:2: error:
--       • Couldn't match type ‘a1 x0 y0’
--                        with ‘forall x y. z1 ~ '(x, y) => a1 x y’
--   ...
--   
--   >>> :t (\(UncurryLazy axy) -> UncurryLazy axy)
--   
--   <interactive>:1:36: error:
--       • Couldn't match type ‘z’ with ‘'(x, y)’
--           arising from a use of ‘axy’
--           because type variables ‘x’, ‘y’ would escape their scope
--   ...
--   
UncurryLazy :: (forall x y. (z ~ '(x, y)) => a x y) -> Uncurry [getUncurryLazy] :: Uncurry -> forall x y. (z ~ '(x, y)) => a x y -- | The UncurryStrict pattern is useful when you need to -- construct/destruct an 'Uncurry a '(x,y)' value -- --
--   >>> :t UncurryStrict . getUncurryStrict
--   UncurryStrict . getUncurryStrict
--     :: Uncurry a '(x, y) -> Uncurry a '(x, y)
--   
--   >>> import Data.Tuple (swap)
--   
--   >>> :t UncurryStrict . Flip . swap . getUncurryStrict
--   UncurryStrict . Flip . swap . getUncurryStrict
--     :: Uncurry (,) '(x, y) -> Uncurry (Flip (,)) '(x, y)
--   
-- -- It works well with function composition and requires fewer hints, but -- cannot be used to construct or match values of type Uncurry a -- z, such as are needed by fmap. -- --
--   >>> :t (\(UncurryLazy axy) -> UncurryStrict axy) :: Uncurry a z -> Uncurry a z
--   
--   <interactive>:1:38: error:
--       • Couldn't match type ‘z1’ with ‘'(x0, y0)’
--   ...
--       • In the first argument of ‘UncurryStrict’, namely ‘axy’
--   ...
--   
--   >>> :t (\(UncurryStrict axy) -> UncurryLazy axy) :: Uncurry a z -> Uncurry a z
--   
--   <interactive>:1:4: error:
--       • Couldn't match type ‘z1’ with ‘'(x0, y0)’
--   ...
--       • In the pattern: UncurryStrict axy
--   ...
--   
-- -- However, it is very useful when paired with toProduct. -- | a pseudo-record accessor, corresponding to matching the -- UncurryStrict pattern. Can be useful when paired with -- fromProduct getUncurryStrict :: Uncurry a '(x, y) -> a x y -- | a helper for lifting functions on curried types to functions on their -- uncurried equivalents. Very useful when using the Functor -- instance for Products. -- --
--   >>> comma' = toProduct UncurryStrict . Pure . Compose . Pure $ ('a', True)
--   
--   >>> :t comma'
--   comma' :: Product (Pure Char) (Pure Bool) (Uncurry (,))
--   
--   >>> :t uncurried (const . snd) <$> comma'
--   uncurried (const . snd) <$> comma'
--     :: Product (Pure Char) (Pure Bool) (Uncurry (->))
--   
uncurried :: (forall x y. a x y -> b x y) -> Uncurry a z -> Uncurry b z -- | A type-level version of pure for Cont -- -- Mainly useful when constructing continuation kind functors using -- Product and Coproduct. newtype Pure (x :: k) (a :: k -> *) Pure :: a x -> Pure [getPure] :: Pure -> a x instance forall k (x :: k) (a :: k -> GHC.Types.*). GHC.Classes.Ord (a x) => GHC.Classes.Ord (Conkin.Pure x a) instance forall k (x :: k) (a :: k -> GHC.Types.*). GHC.Classes.Eq (a x) => GHC.Classes.Eq (Conkin.Pure x a) instance forall k (x :: k) (a :: k -> GHC.Types.*). GHC.Show.Show (a x) => GHC.Show.Show (Conkin.Pure x a) instance forall j i (a :: i -> j -> GHC.Types.*) (y :: j) (x :: i). GHC.Classes.Ord (a x y) => GHC.Classes.Ord (Conkin.Flip a y x) instance forall j i (a :: i -> j -> GHC.Types.*) (y :: j) (x :: i). GHC.Classes.Eq (a x y) => GHC.Classes.Eq (Conkin.Flip a y x) instance forall j i (a :: i -> j -> GHC.Types.*) (y :: j) (x :: i). GHC.Show.Show (a x y) => GHC.Show.Show (Conkin.Flip a y x) instance forall k (x0 :: k) (x1 :: k) (a :: k -> GHC.Types.*). (GHC.Classes.Ord (a x1), GHC.Classes.Ord (a x0)) => GHC.Classes.Ord (Conkin.Pair x0 x1 a) instance forall k (x0 :: k) (x1 :: k) (a :: k -> GHC.Types.*). (GHC.Classes.Eq (a x1), GHC.Classes.Eq (a x0)) => GHC.Classes.Eq (Conkin.Pair x0 x1 a) instance forall k (x0 :: k) (x1 :: k) (a :: k -> GHC.Types.*). (GHC.Show.Show (a x1), GHC.Show.Show (a x0)) => GHC.Show.Show (Conkin.Pair x0 x1 a) instance forall (f :: GHC.Types.* -> GHC.Types.*) k (x :: k) (a :: k -> GHC.Types.*). GHC.Classes.Ord (f (a x)) => GHC.Classes.Ord (Conkin.Dispose f x a) instance forall (f :: GHC.Types.* -> GHC.Types.*) k (x :: k) (a :: k -> GHC.Types.*). GHC.Classes.Eq (f (a x)) => GHC.Classes.Eq (Conkin.Dispose f x a) instance forall (f :: GHC.Types.* -> GHC.Types.*) k (x :: k) (a :: k -> GHC.Types.*). GHC.Show.Show (f (a x)) => GHC.Show.Show (Conkin.Dispose f x a) instance forall j i (f :: (i -> *) -> *) (g :: (j -> *) -> *) (a :: (i, j) -> GHC.Types.*). GHC.Show.Show (f (Data.Functor.Compose.Compose g (Conkin.Curry a))) => GHC.Show.Show (Conkin.Product f g a) instance forall i (f :: (i -> *) -> *) j (g :: (j -> *) -> *) (a :: (i, j) -> GHC.Types.*). GHC.Classes.Eq (f (Data.Functor.Compose.Compose g (Conkin.Curry a))) => GHC.Classes.Eq (Conkin.Product f g a) instance forall i (f :: (i -> *) -> *) j (g :: (j -> *) -> *) (a :: (i, j) -> GHC.Types.*). GHC.Classes.Ord (f (Data.Functor.Compose.Compose g (Conkin.Curry a))) => GHC.Classes.Ord (Conkin.Product f g a) instance forall j i (f :: (i -> *) -> *) (a :: Data.Either.Either i j -> *) (g :: (j -> *) -> *). (GHC.Show.Show (f (Data.Functor.Compose.Compose a 'Data.Either.Left)), GHC.Show.Show (g (Data.Functor.Compose.Compose a 'Data.Either.Right))) => GHC.Show.Show (Conkin.Coproduct f g a) instance forall i (f :: (i -> *) -> *) j (g :: (j -> *) -> *) (a :: Data.Either.Either i j -> *). (GHC.Classes.Eq (f (Data.Functor.Compose.Compose a 'Data.Either.Left)), GHC.Classes.Eq (g (Data.Functor.Compose.Compose a 'Data.Either.Right))) => GHC.Classes.Eq (Conkin.Coproduct f g a) instance forall i (f :: (i -> *) -> *) j (g :: (j -> *) -> *) (a :: Data.Either.Either i j -> *). (GHC.Classes.Ord (f (Data.Functor.Compose.Compose a 'Data.Either.Left)), GHC.Classes.Ord (g (Data.Functor.Compose.Compose a 'Data.Either.Right))) => GHC.Classes.Ord (Conkin.Coproduct f g a) instance forall i j (a :: (i, j) -> *) (x :: i) (y :: j). GHC.Show.Show (a '(x, y)) => GHC.Show.Show (Conkin.Curry a x y) instance forall i j (a :: (i, j) -> *) (x :: i) (y :: j). GHC.Classes.Eq (a '(x, y)) => GHC.Classes.Eq (Conkin.Curry a x y) instance forall i j (a :: (i, j) -> *) (x :: i) (y :: j). GHC.Classes.Ord (a '(x, y)) => GHC.Classes.Ord (Conkin.Curry a x y) instance forall k k1 (a :: k1 -> k -> *) (x :: k1) (y :: k). GHC.Show.Show (a x y) => GHC.Show.Show (Conkin.Uncurry a '(x, y)) instance forall k k1 (a :: k -> k1 -> *) (x :: k) (y :: k1). GHC.Classes.Eq (a x y) => GHC.Classes.Eq (Conkin.Uncurry a '(x, y)) instance forall k k1 (a :: k -> k1 -> *) (x :: k) (y :: k1). GHC.Classes.Ord (a x y) => GHC.Classes.Ord (Conkin.Uncurry a '(x, y)) instance forall k (f :: * -> *) (x :: k). GHC.Base.Functor f => Conkin.Functor (Conkin.Dispose f x) instance forall k (f :: * -> *) (x :: k). GHC.Base.Applicative f => Conkin.Applicative (Conkin.Dispose f x) instance forall k (t :: * -> *) (x :: k). Data.Foldable.Foldable t => Conkin.Foldable (Conkin.Dispose t x) instance forall i (t :: * -> *) (x :: i). Data.Traversable.Traversable t => Conkin.Traversable (Conkin.Dispose t x) instance forall k (t :: (k -> GHC.Types.*) -> GHC.Types.*). GHC.Base.Functor (Conkin.Coyoneda t) instance forall k (t :: (k -> GHC.Types.*) -> GHC.Types.*). Conkin.Applicative t => GHC.Base.Applicative (Conkin.Coyoneda t) instance forall k (t :: (k -> GHC.Types.*) -> GHC.Types.*). Conkin.Foldable t => Data.Foldable.Foldable (Conkin.Coyoneda t) instance forall k (t :: (k -> GHC.Types.*) -> GHC.Types.*). Conkin.Traversable t => Data.Traversable.Traversable (Conkin.Coyoneda t) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Functor f, Conkin.Functor g) => Conkin.Functor (Conkin.Product f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Applicative f, Conkin.Applicative g) => Conkin.Applicative (Conkin.Product f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Foldable f, Conkin.Foldable g) => Conkin.Foldable (Conkin.Product f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Traversable f, Conkin.Traversable g) => Conkin.Traversable (Conkin.Product f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Functor f, Conkin.Functor g) => Conkin.Functor (Conkin.Coproduct f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Applicative f, Conkin.Applicative g) => Conkin.Applicative (Conkin.Coproduct f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Foldable f, Conkin.Foldable g) => Conkin.Foldable (Conkin.Coproduct f g) instance forall j i (f :: (i -> GHC.Types.*) -> GHC.Types.*) (g :: (j -> GHC.Types.*) -> GHC.Types.*). (Conkin.Traversable f, Conkin.Traversable g) => Conkin.Traversable (Conkin.Coproduct f g) instance forall k (x0 :: k) (x1 :: k). Conkin.Functor (Conkin.Pair x0 x1) instance forall k (x0 :: k) (x1 :: k). Conkin.Applicative (Conkin.Pair x0 x1) instance forall k (x0 :: k) (x1 :: k). Conkin.Foldable (Conkin.Pair x0 x1) instance forall i (x0 :: i) (x1 :: i). Conkin.Traversable (Conkin.Pair x0 x1) instance forall k (a :: k -> GHC.Types.*). GHC.Show.Show (Conkin.Tuple '[] a) instance forall k (a :: k -> *) (x :: k) (xs :: [k]). (GHC.Show.Show (a x), GHC.Show.Show (Conkin.Tuple xs a)) => GHC.Show.Show (Conkin.Tuple (x : xs) a) instance forall k (a :: k -> GHC.Types.*). GHC.Classes.Eq (Conkin.Tuple '[] a) instance forall k (a :: k -> *) (x :: k) (xs :: [k]). (GHC.Classes.Eq (a x), GHC.Classes.Eq (Conkin.Tuple xs a)) => GHC.Classes.Eq (Conkin.Tuple (x : xs) a) instance forall k (a :: k -> GHC.Types.*). GHC.Classes.Ord (Conkin.Tuple '[] a) instance forall k (a :: k -> *) (x :: k) (xs :: [k]). (GHC.Classes.Ord (a x), GHC.Classes.Ord (Conkin.Tuple xs a)) => GHC.Classes.Ord (Conkin.Tuple (x : xs) a) instance forall k (xs :: [k]). Conkin.Functor (Conkin.Tuple xs) instance Conkin.Applicative (Conkin.Tuple '[]) instance forall k (xs :: [k]) (x :: k). Conkin.Applicative (Conkin.Tuple xs) => Conkin.Applicative (Conkin.Tuple (x : xs)) instance forall k (xs :: [k]). Conkin.Foldable (Conkin.Tuple xs) instance forall i (xs :: [i]). Conkin.Traversable (Conkin.Tuple xs) instance forall k (a :: k -> GHC.Types.*). GHC.Show.Show (Conkin.Tagged '[] a) instance forall k (a :: k -> GHC.Types.*). GHC.Classes.Eq (Conkin.Tagged '[] a) instance forall k (a :: k -> GHC.Types.*). GHC.Classes.Ord (Conkin.Tagged '[] a) instance forall k (a :: k -> *) (x :: k) (xs :: [k]). (GHC.Show.Show (a x), GHC.Show.Show (Conkin.Tagged xs a)) => GHC.Show.Show (Conkin.Tagged (x : xs) a) instance forall k (a :: k -> *) (x :: k) (xs :: [k]). (GHC.Classes.Eq (a x), GHC.Classes.Eq (Conkin.Tagged xs a)) => GHC.Classes.Eq (Conkin.Tagged (x : xs) a) instance forall k (a :: k -> *) (x :: k) (xs :: [k]). (GHC.Classes.Ord (a x), GHC.Classes.Ord (Conkin.Tagged xs a)) => GHC.Classes.Ord (Conkin.Tagged (x : xs) a) instance forall k (xs :: [k]). Conkin.Functor (Conkin.Tagged xs) instance forall k (xs :: [k]). Conkin.Foldable (Conkin.Tagged xs) instance forall i (xs :: [i]). Conkin.Traversable (Conkin.Tagged xs) instance Conkin.Functor (Data.Functor.Const.Const a) instance GHC.Base.Monoid m => Conkin.Applicative (Data.Functor.Const.Const m) instance Conkin.Foldable (Data.Functor.Const.Const m) instance Conkin.Traversable (Data.Functor.Const.Const m) instance forall k (f :: * -> *) (g :: (k -> GHC.Types.*) -> GHC.Types.*). (GHC.Base.Functor f, Conkin.Functor g) => Conkin.Functor (Data.Functor.Compose.Compose f g) instance forall k (f :: * -> *) (g :: (k -> GHC.Types.*) -> GHC.Types.*). (GHC.Base.Applicative f, Conkin.Applicative g) => Conkin.Applicative (Data.Functor.Compose.Compose f g) instance forall k (f :: * -> *) (g :: (k -> GHC.Types.*) -> GHC.Types.*). (Data.Foldable.Foldable f, Conkin.Foldable g) => Conkin.Foldable (Data.Functor.Compose.Compose f g) instance forall i (f :: * -> *) (g :: (i -> GHC.Types.*) -> GHC.Types.*). (Data.Traversable.Traversable f, Conkin.Traversable g) => Conkin.Traversable (Data.Functor.Compose.Compose f g) instance forall k (x :: k). Conkin.Functor (Conkin.Pure x) instance forall k (x :: k). Conkin.Applicative (Conkin.Pure x) instance forall k (x :: k). Conkin.Foldable (Conkin.Pure x) instance forall i (x :: i). Conkin.Traversable (Conkin.Pure x)