proarrow-0: Category theory with a central role for profunctors
Safe HaskellNone
LanguageHaskell2010

Proarrow.Squares.Limit

Synopsis

Documentation

limit :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {a :: k1} {i :: k1} {k2 :: k1} (j :: hk i a) (d :: vk i k2). (Ob0 vk i, HasLimits vk j k2, Ob d) => Sq '(j '::: ('Nil :: Path hk a a), Limit j d '::: ('Nil :: Path vk k2 k2)) '('Nil :: Path hk k2 k2, d '::: ('Nil :: Path vk k2 k2)) Source Comments #

The projection out of the j-weighted limit l of d.

A--l--K
|  v  |
j--@  |
|  v  |
I--d--K

limitUniv :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {a :: k1} {i :: k1} {k2 :: k1} (j :: hk i a) (d :: vk i k2) (p :: vk a k2). (Ob0 vk i, HasLimits vk j k2, Ob d, Ob p) => Sq '(j '::: ('Nil :: Path hk a a), p '::: ('Nil :: Path vk k2 k2)) '('Nil :: Path hk k2 k2, d '::: ('Nil :: Path vk k2 k2)) -> Sq '('Nil :: Path hk a a, p '::: ('Nil :: Path vk k2 k2)) '('Nil :: Path hk k2 k2, Limit j d '::: ('Nil :: Path vk k2 k2)) Source Comments #

The universal property of the limit.

The dotted inner square is the input square, the outer square is the output square.

A-+--p--+-K
| :  v  : |
| j--@  : |
| :  v  : |
| I..d..K |
A----l----K

rightAdjointPreservesLimits :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {k2 :: k1} {k' :: k1} {i :: k1} {a :: k1} (f :: vk k' k2) (g :: vk k2 k') (d :: vk i k2) (j :: hk i a). (Adjunction f g, HasCompanions hk vk, Ob d, Ob f, Ob g, HasLimits vk j k2, HasLimits vk j k', Ob0 vk i, Ob0 vk k2, Ob0 vk k', Ob0 vk a) => Sq '('Nil :: Path hk a a, Limit j (O g d) '::: ('Nil :: Path vk k' k')) '('Nil :: Path hk k' k', Limit j d '::: (g '::: ('Nil :: Path vk k' k'))) Source Comments #

Preservation of limits by right adjoints

Let l be the j-weighted limit of d and l' be the j-weighted limit of g ∘ d. Then we provide the following square:

A--l'-K'
|  v  |
|  @  |
| / \ |
| v v |
A-l-g-K'

With this implementation:

+-----l'--+---------+
|     v   |   /@\   |
|     |   |  v   v  |
+-+---l'--+-f-+-+-g-+
| :   v   | v : | v |
| j---@   | | : | | |
| :  / \  | | : | | |
| : v   v | v : | | |
| +-d-+-g-+-f-+ | | |
| : | | v   v : | | |
| : v |  \@/  : | | |
| +.d.+.......+ | v |
+-------l-------+-g-+

rightAdjointPreservesLimitsInv :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {k2 :: k1} {k' :: k1} {i :: k1} {a :: k1} (g :: vk k2 k') (d :: vk i k2) (j :: hk i a). (HasCompanions hk vk, Ob d, Ob g, HasLimits vk j k2, HasLimits vk j k', Ob0 vk i, Ob0 vk k2, Ob0 vk k', Ob0 vk a) => Sq '('Nil :: Path hk a a, Limit j d '::: (g '::: ('Nil :: Path vk k' k'))) '('Nil :: Path hk k' k', Limit j (O g d) '::: ('Nil :: Path vk k' k')) Source Comments #

The inverse works for any arrow:

The required square

A-l-g-K'
| v v |
| \@/ |
|  |  |
A--l'-K'

is implemented as

A-+-l-+-g-+-K'
| : v | v : |
| j-@ | | : |
| : v | v : |
| +.d.+.g.+ |
A-----l'----K'

colimit :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {a :: k1} {i :: k1} {k2 :: k1} (j :: hk a i) (d :: vk i k2). (Ob0 vk i, HasColimits vk j k2, Ob d) => Sq '(j '::: ('Nil :: Path hk i i), d '::: ('Nil :: Path vk k2 k2)) '('Nil :: Path hk k2 k2, Colimit j d '::: ('Nil :: Path vk k2 k2)) Source Comments #

The projection into the j-weighted colimit c of d.

I--d--K
|  v  |
j--@  |
|  v  |
A--l--K

colimitUniv :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {a :: k1} {i :: k1} {k2 :: k1} (j :: hk a i) (d :: vk i k2) (p :: vk a k2). (Ob0 vk i, HasColimits vk j k2, Ob d, Ob p) => Sq '(j '::: ('Nil :: Path hk i i), d '::: ('Nil :: Path vk k2 k2)) '('Nil :: Path hk k2 k2, p '::: ('Nil :: Path vk k2 k2)) -> Sq '('Nil :: Path hk a a, Colimit j d '::: ('Nil :: Path vk k2 k2)) '('Nil :: Path hk k2 k2, p '::: ('Nil :: Path vk k2 k2)) Source Comments #

The universal property of the colimit.

The dotted inner square is the input square, the outer square is the output square.

A----c----K
| I..d..K |
| :  v  : |
| j--@  : |
| :  v  : |
A-+--p--+-K

leftAdjointPreservesColimits :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {k2 :: k1} {k' :: k1} {i :: k1} {a :: k1} (f :: vk k2 k') (g :: vk k' k2) (d :: vk i k2) (j :: hk a i). (Adjunction f g, HasCompanions hk vk, Ob d, Ob f, Ob g, HasColimits vk j k2, HasColimits vk j k', Ob0 vk i, Ob0 vk k2, Ob0 vk k', Ob0 vk a) => Sq '('Nil :: Path hk a a, Colimit j d '::: (f '::: ('Nil :: Path vk k' k'))) '('Nil :: Path hk k' k', Colimit j (O f d) '::: ('Nil :: Path vk k' k')) Source Comments #

Preservation of colimits by left adjoints

Let c be the j-weighted colimit of d and c' be the j-weighted colimit of g ∘ d. Then we provide the following square:

A-c-f-K'
| v v |
| \ / |
|  @  |
|  v  |
A--c'-K'

With this implementation:

+-------c-------+-f-+
| +.d.+.......+ | v |
| : v |  /@\  : | | |
| : | | v   v : | | |
| +-d-+-f-+-g-+ | | |
| : v   v | v : | | |
| :  \ /  | | : | | |
| j---@   | | : | | |
| :   v   | v : | v |
+-+---c'--+-g-+-+-f-+
|     |   |  v   v  |
|     v   |   \@/   |
+-----c'--+---------+

leftAdjointPreservesColimitsInv :: forall {k1} {hk :: k1 -> k1 -> Type} {vk :: k1 -> k1 -> Type} {k2 :: k1} {k' :: k1} {i :: k1} {a :: k1} (f :: vk k2 k') (d :: vk i k2) (j :: hk a i). (HasCompanions hk vk, Ob d, Ob f, HasColimits vk j k2, HasColimits vk j k', Ob0 vk i, Ob0 vk k2, Ob0 vk k', Ob0 vk a) => Sq '('Nil :: Path hk a a, Colimit j (O f d) '::: ('Nil :: Path vk k' k')) '('Nil :: Path hk k' k', Colimit j d '::: (f '::: ('Nil :: Path vk k' k'))) Source Comments #

The inverse works for any arrow:

The required square

A--c'-K'
|  |  |
| /@\ |
| v v |
A-c-g-K'

is implemented as

A-----c'----K'
| +.d.+.f.+ |
| : v | v : |
| j-@ | | : |
| : v | v : |
A-+-c-+-f-+-K'

unit :: forall {k1} {hk :: CAT k1} {vk :: k1 -> k1 -> Type} {j :: k1} {k2 :: k1} (f :: vk j k2) (g :: vk k2 j). (Adjunction f g, HasCompanions hk vk, Ob f, Ob g, Ob0 vk j, Ob0 vk k2) => Sq '('Nil :: Path hk j j, 'Nil :: Path vk j j) '('Nil :: Path hk j j, f '::: (g '::: ('Nil :: Path vk j j))) Source Comments #

counit :: forall {k1} {hk :: CAT k1} {vk :: k1 -> k1 -> Type} {j :: k1} {k2 :: k1} (f :: vk j k2) (g :: vk k2 j). (Adjunction f g, HasCompanions hk vk, Ob f, Ob g, Ob0 vk j, Ob0 vk k2) => Sq '('Nil :: Path hk k2 k2, g '::: (f '::: ('Nil :: Path vk k2 k2))) '('Nil :: Path hk k2 k2, 'Nil :: Path vk k2 k2) Source Comments #