proarrow
Safe HaskellNone
LanguageGHC2024

Proarrow.Category.Sheaf

Description

Sites and sheaves. A Site is a category with a coverage: for each object, the families of arrows into it that count as covering it, each given by its legs. A profunctor is a Sheaf for the coverage when, on every cover, every matching family of its elements glues to exactly one element at the covered object.

A cover of a generates a sieve: every arrow into a that factors through one of the cover's legs. When the covers are stable and compose, the coverage generates a Grothendieck topology; Sums below shows that it need not. Covers are given by their legs here because that is what someone writing a site down actually has -- a sieve is usually infinite, a list of legs is not. Those sieves are also the truth values of a category of presheaves; see Proarrow.Profunctor.Instance.Sieve.

Asking for a sheaf rather than a bare profunctor rules out two specific failures. Say you want p a to be data local to a, and a cover of a to be a way of taking that data apart. A bare profunctor says nothing about how the whole relates to its parts, so it allows both of these:

  • Too many wholes. Two distinct elements at a can restrict to the same family on the cover. Then agreeing everywhere on a cover does not make two things equal, so nothing can be proved by taking an object apart.
  • Too few. A family on the cover that agrees on the overlaps can have no element at a restricting to it. Then compatible local data cannot be assembled, so nothing can be built by putting an object together.

The sheaf condition is exactly the absence of both -- see Sheaf for the laws. Neither half implies the other, and counting the two sides decides neither, as three presheaves from Props.Sheaf show:

                                       elements at a   matching families   verdict
the representable at FLS, ByArrow            0                 1           too few
the constant presheaf, Canonical             2                 1           too many
the collapsing presheaf, ByArrow             2                 2           not injective

Covers given by generating arrows, and gluing as an operation rather than a condition, follow Arnaud Spiwack's Sheaves in Haskell (Tweag, 2026, https://www.tweag.io/blog/2026-06-18-sheaves-in-haskell/). What is added here is the category. Matching is stated as an equation over commuting squares: for any z and any p :: z ~> x, q :: z ~> y with legArrow g . p = legArrow g' . q, lmap p (m g) = lmap q (m g'). It quantifies over such z rather than over the pullback, so the pullback of two legs need not exist as an object -- which is what lets Sums work over a free category that has none. Added too, in Proarrow.Category.Enriched.Finitary.Sheaf: the sieves, the classifier and a decision procedure for the sheaf condition.

Synopsis

Sites

class CategoryOf k => Site t k where Source Github #

A coverage, named t, on the category k. Several coverages can live on one category, so the name is a parameter rather than a wrapper on the kind.

A cover is given by its legs, the generating arrows of the covering family. The identity cover, which every coverage has, is left implicit: Cover and covers list the others. The one law is

Stability
covers pull back. Given a cover c of a and any f :: b ~> a, the object b has a cover -- possibly just its identity -- each of whose legs h satisfies f . h = legArrow g . h' for some leg g of c and some h'. Only the equation is asked for; no pullback object has to exist.

Associated Types

data Cover t k (a :: k) c Source Github #

A cover of a. The type c names it, so that Leg can say which cover a leg belongs to; the value is the evidence that c covers a.

data Leg t k (a :: k) c (x :: k) Source Github #

A leg of the cover c of a, with source x.

Methods

legArrow :: forall (a :: k) c (x :: k). Leg t k a c x -> x ~> a Source Github #

The arrow a leg stands for.

legs :: forall (a :: k) c. Cover t k a c -> [SomeLeg t k a c] Source Github #

The legs of a cover.

Instances

Instances details
Site ByArrow BOOL Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Associated Types

data Cover ByArrow BOOL (a :: BOOL) c 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg ByArrow BOOL (a :: BOOL) c (x :: BOOL) 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg ByArrow BOOL (a :: BOOL) c (x :: BOOL) where

Methods

legArrow :: forall (a :: BOOL) c (x :: BOOL). Leg ByArrow BOOL a c x -> x ~> a Source Github #

legs :: forall (a :: BOOL) c. Cover ByArrow BOOL a c -> [SomeLeg ByArrow BOOL a c] Source Github #

CategoryOf k => Site Trivial k Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

legArrow :: forall (a :: k) c (x :: k). Leg Trivial k a c x -> x ~> a Source Github #

legs :: forall (a :: k) c. Cover Trivial k a c -> [SomeLeg Trivial k a c] Source Github #

Site Canonical (BOOL, BOOL) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Associated Types

data Cover Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)) 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)) where

Methods

legArrow :: forall (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)). Leg Canonical (BOOL, BOOL) a c x -> x ~> a Source Github #

legs :: forall (a :: (BOOL, BOOL)) c. Cover Canonical (BOOL, BOOL) a c -> [SomeLeg Canonical (BOOL, BOOL) a c] Source Github #

Elem HasBinaryCoproducts cs => Site Sums (FREE cs p) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

legArrow :: forall (a :: FREE cs p) c (x :: FREE cs p). Leg Sums (FREE cs p) a c x -> x ~> a Source Github #

legs :: forall (a :: FREE cs p) c. Cover Sums (FREE cs p) a c -> [SomeLeg Sums (FREE cs p) a c] Source Github #

data SomeLeg t k (a :: k) c where Source Github #

A leg of the cover c of a, with its source hidden.

Constructors

SomeLeg :: forall t k (a :: k) c (x :: k). Leg t k a c x -> SomeLeg t k a c 

class Site t k => HasFiniteCovers t k where Source Github #

A site whose covers can be listed, object by object. This is what the law tests and the decision procedure of Proarrow.Category.Enriched.Finitary.Sheaf quantify over. A free category is a Site but not this: whether an object is a sum is not something its Ob can answer.

Beyond Site's Stability, listing the covers comes with a second law:

Composition
covers compose. If c covers a and every leg of c is itself covered, the composites cover a too. Stability and composition together are what make the coverage generate a Grothendieck topology, and so make closure idempotent and meet-preserving -- without which the dense sieves at an object are not closed under meets, which is what Plus rests on. testLawvereTierney is the check.

Methods

covers :: forall (a :: k). Ob a => [SomeCover t k a] Source Github #

The covers of an object, beyond the identity.

Instances

Instances details
HasFiniteCovers ByArrow BOOL Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

covers :: forall (a :: BOOL). Ob a => [SomeCover ByArrow BOOL a] Source Github #

CategoryOf k => HasFiniteCovers Trivial k Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

covers :: forall (a :: k). Ob a => [SomeCover Trivial k a] Source Github #

HasFiniteCovers Canonical (BOOL, BOOL) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

covers :: forall (a :: (BOOL, BOOL)). Ob a => [SomeCover Canonical (BOOL, BOOL) a] Source Github #

data SomeCover t k (a :: k) where Source Github #

A cover of a, with its name hidden.

Constructors

SomeCover :: forall t k (a :: k) c. Cover t k a c -> SomeCover t k a 

Sheaves

class (Site t k, Profunctor p) => Sheaf t (p :: j +-> k) where Source Github #

A profunctor that is a sheaf for the coverage t on the contravariant side: elements over a cover glue. A family m over the legs of a cover c is matching when it agrees on overlaps: for legs g and g' and any p :: z ~> x, q :: z ~> y with legArrow g . p = legArrow g' . q, lmap p (m g) = lmap q (m g'). Sums below is the smallest worked instance of that condition, where it comes to one equation. The laws are

Restriction
for matching m, lmap (legArrow g) (glue c m) = m g at every leg g of c: the gluing restricts back to the family;
Uniqueness
glue c (\g -> lmap (legArrow g) x) = x: an element is the gluing of its own restrictions.

The laws constrain glue on matching families only, and its type accepts any family, so its value on a non-matching one is unspecified. The Sums instance below is the live example: it keeps one leg's covariant component and discards the other, which is sound only because matching forces them equal.

Together they say that restriction is a bijection from the elements at a to the matching families on c, which is the sheaf condition. Gluing is stated for every b at once: a profunctor j +-> k is a sheaf when, for each object b of j, the presheaf p (-) b on k is one. Once the glued element at (a, b) is fixed, dimap fixes its value at every other point (g, h) of the sieve the cover generates -- which is why Proarrow.Category.Enriched.Finitary.Sheaf can decide the same condition as natural transformations out of that sieve.

Gluing is contravariant, and not by choice: a coverage presents each object by the arrows into it, and k is the side of p a b that lmap acts on. The dual needs a cocoverage, which is a coverage on OPPOSITE k, and a cosheaf for it is Sheaf t (Op p); nothing supplies a cocoverage yet, though Finitary (Op p) makes the machinery available for one. The instances are indexed by the shape of the profunctor: the limits just below, a site's representables, and the image of sheafification (Plus twice over). One indexed by the coverage instead cuts across that axis and so overlaps all of them -- which is why glueTrivial is a function and not an instance Sheaf Trivial p.

Methods

glue :: forall (a :: k) c (b :: j). (Ob a, Ob b) => Cover t k a c -> (forall (x :: k). Leg t k a c x -> p x b) -> p a b Source Github #

Instances

Instances details
(Site t k, CategoryOf j) => Sheaf t (TerminalProfunctor :: k -> j -> Type) Source Github #

The limits of profunctors are sheaves whenever their factors are: the terminal profunctor for every coverage, and a product of sheaves glued componentwise.

Instance details

Defined in Proarrow.Category.Sheaf

Methods

glue :: forall (a :: k) c (b :: j). (Ob a, Ob b) => Cover t k a c -> (forall (x :: k). Leg t k a c x -> TerminalProfunctor x b) -> TerminalProfunctor a b Source Github #

(Site t k, LocallyFinite k, CategoryOf j) => Sheaf t (Sheafify t p :: k -> j -> Type) Source Github #

Sheafification lands in the sheaves. This is the theorem Props.Sheaf checks by enumeration with isSheaf @t @(Sheafify t p); here it is as an instance, so a Sheafify can be used wherever a Sheaf is asked for.

gluePlus would type-check for any Plus t q, but its laws need q separated -- which Plus t p always is, so the head is the double plus. The single-plus statement that is also true, Sheaf t p => Sheaf t (Plus t p), is thereby foreclosed for good: it would overlap this one with neither more specific.

Instance details

Defined in Proarrow.Category.Enriched.Finitary.Sheaf

Methods

glue :: forall (a :: k) c (b :: j). (Ob a, Ob b) => Cover t k a c -> (forall (x :: k). Leg t k a c x -> Sheafify t p x b) -> Sheafify t p a b Source Github #

(Sheaf t p, Sheaf t q) => Sheaf t (p :*: q :: k -> j -> Type) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

glue :: forall (a :: k) c (b :: j). (Ob a, Ob b) => Cover t k a c -> (forall (x :: k). Leg t k a c x -> (p :*: q) x b) -> (p :*: q) a b Source Github #

Sheaf t p => Sheaf t (Reindex 'Subobject p fs :: k -> j -> Type) Source Github #

A retabulation of a sheaf glues as the sheaf does -- for a Subobject table. Not for a Quotient one, where glue would not even be well defined: it would read a class through whichever representative it was handed, and the element it glues need not be in the class the family came from. A quotient of a sheaf is no sheaf, which is why colimits of sheaves go through sheafification -- and why the marker has to be in the type, since coequalize builds exactly such a quotient out of objects that are sheaves.

A Subobject table is still not enough on its own: what is asked is that it cut out a subsheaf, as the tables of equalize and the pullbacks do. That much stays a precondition, of the same shape as the two instances above and failing the same loud way -- a glued element outside every fibre is what toIndex reports.

Instance details

Defined in Proarrow.Category.Enriched.Finitary.Topos

Methods

glue :: forall (a :: k) c (b :: j). (Ob a, Ob b) => Cover t k a c -> (forall (x :: k). Leg t k a c x -> Reindex 'Subobject p fs x b) -> Reindex 'Subobject p fs a b Source Github #

(Site t k, FiniteCat j, FiniteCat k, KnownTables j k lm rm) => Sheaf t (Tabulated t lm rm :: k -> j -> Type) Source Github #

A tabulated profunctor glues by search, since it knows nothing of the profunctor it presents. Only for the coverage its tag names: the tag is the whole of the evidence that the search will find its element, so a presentation may be used as a sheaf for the coverage it was checked against and for no other. At Trivial, which withTabulated applies and which has no covers, the instance is vacuous and glueBySearch is unreachable.

Instance details

Defined in Proarrow.Category.Enriched.Finitary.Topos

Methods

glue :: forall (a :: k) c (b :: j). (Ob a, Ob b) => Cover t k a c -> (forall (x :: k). Leg t k a c x -> Tabulated t lm rm x b) -> Tabulated t lm rm a b Source Github #

(Elem HasBinaryCoproducts cs, Elem HasInitialObject cs, CategoryOf j) => Sheaf Sums (Yo x ('OP b) :: FREE cs p -> j -> Type) Source Github #

Sums are colimits, so the representables are sheaves for Sums: gluing is ||| on the contravariant component.

The initial object is needed, even though the coproduct alone builds the gluing. An element of Yo x (OP b) at z carries a second, covariant component b ~> d, and a family over the two injections carries one of those per leg, while the glued element can carry only one. What forces the two to agree is the matching condition, and the two injections overlap only at the initial object: lft . initiate = rgt . initiate, so a matching family must take equal values there, and the first components being initiate either way leaves exactly the agreement of the second. Without an initial object the injections have no overlap at all, every family is vacuously matching, and restriction fails for any j with a hom-set bigger than one.

The decision procedure in Proarrow.Category.Enriched.Finitary.Sheaf does not need this, because it reads the condition off the generated sieve, which carries every arrow of j and so ties the covariant components together on its own.

Instance details

Defined in Proarrow.Category.Sheaf

Methods

glue :: forall (a :: FREE cs p) c (b0 :: j). (Ob a, Ob b0) => Cover Sums (FREE cs p) a c -> (forall (x0 :: FREE cs p). Leg Sums (FREE cs p) a c x0 -> Yo x ('OP b) x0 b0) -> Yo x ('OP b) a b0 Source Github #

Example sites

data Trivial Source Github #

The trivial coverage: only identities cover, so every profunctor is a sheaf.

Instances

Instances details
CategoryOf k => HasFiniteCovers Trivial k Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

covers :: forall (a :: k). Ob a => [SomeCover Trivial k a] Source Github #

CategoryOf k => Site Trivial k Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

legArrow :: forall (a :: k) c (x :: k). Leg Trivial k a c x -> x ~> a Source Github #

legs :: forall (a :: k) c. Cover Trivial k a c -> [SomeLeg Trivial k a c] Source Github #

data Cover Trivial k (a :: k) c Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Cover Trivial k (a :: k) c
data Leg Trivial k (a :: k) c (x :: k) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Trivial k (a :: k) c (x :: k)

glueTrivial :: forall {k1} k2 (a :: k2) c p (b :: k1). Cover Trivial k2 a c -> (forall (x :: k2). Leg Trivial k2 a c x -> p x b) -> p a b Source Github #

Every profunctor is a sheaf for Trivial, by the eliminator of an empty Cover. This is a function rather than an instance Sheaf Trivial p because that head and the two closure instances above overlap -- at Sheaf Trivial TerminalProfunctor, say -- with neither more specific than the other, so GHC could not choose between them. Write glue = glueTrivial to get the instance for one profunctor.

data ByArrow Source Github #

The walking arrow BOOL with TRU covered by FLS alone. The one leg has no overlap with itself beyond its source, so every element at FLS is a matching family, and a presheaf is a sheaf exactly when its restriction along F2T is a bijection. The coverage is stable, since pulling the cover back along F2T gives the identity of FLS, but not subcanonical: the representable at FLS has an element at FLS and none at TRU, so it is not a sheaf.

Instances

Instances details
HasFiniteCovers ByArrow BOOL Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

covers :: forall (a :: BOOL). Ob a => [SomeCover ByArrow BOOL a] Source Github #

Site ByArrow BOOL Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Associated Types

data Cover ByArrow BOOL (a :: BOOL) c 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg ByArrow BOOL (a :: BOOL) c (x :: BOOL) 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg ByArrow BOOL (a :: BOOL) c (x :: BOOL) where

Methods

legArrow :: forall (a :: BOOL) c (x :: BOOL). Leg ByArrow BOOL a c x -> x ~> a Source Github #

legs :: forall (a :: BOOL) c. Cover ByArrow BOOL a c -> [SomeLeg ByArrow BOOL a c] Source Github #

data Cover ByArrow BOOL (a :: BOOL) c Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg ByArrow BOOL (a :: BOOL) c (x :: BOOL) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg ByArrow BOOL (a :: BOOL) c (x :: BOOL) where

data TruByFls Source Github #

The name of ByArrow's one cover, whose Cover constructor is TruByFls and whose one Leg constructor is ViaF2T.

data Canonical Source Github #

The open-cover coverage of the discrete two-point space, whose opens are (BOOL, BOOL) (see Proarrow.Category.Instance.Product): the whole space is covered by its two singletons, and the empty set by no opens at all. The covers are stable and compose, so the covering sieves are exactly those whose union is the object; and since a union of opens is their colimit -- the empty union included -- every representable presheaf is a sheaf: the coverage is subcanonical. A sheaf has exactly one section over the empty set, and its sections over the whole space are the pairs of sections over the two points.

Subcanonical is about the representable presheaves. A two-sided Yo a (OP b) need not be a sheaf: the empty cover asks for exactly one element at '(FLS, FLS) for every object of j, while Yo a (OP b) has none at an object b has no arrow to.

Instances

Instances details
HasFiniteCovers Canonical (BOOL, BOOL) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

covers :: forall (a :: (BOOL, BOOL)). Ob a => [SomeCover Canonical (BOOL, BOOL) a] Source Github #

Site Canonical (BOOL, BOOL) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Associated Types

data Cover Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)) 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)) where

Methods

legArrow :: forall (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)). Leg Canonical (BOOL, BOOL) a c x -> x ~> a Source Github #

legs :: forall (a :: (BOOL, BOOL)) c. Cover Canonical (BOOL, BOOL) a c -> [SomeLeg Canonical (BOOL, BOOL) a c] Source Github #

data Cover Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Canonical (BOOL, BOOL) (a :: (BOOL, BOOL)) c (x :: (BOOL, BOOL)) where

data ByPoints Source Github #

The name of Canonical's cover of the whole space, whose Cover constructor is ByPoints and whose Leg constructors are AtX and AtY, one per singleton.

data ByNothing Source Github #

The name of Canonical's cover of the empty set, whose Cover constructor is ByNothing and which has no legs.

data Sums Source Github #

The sum coverage on a free category with binary coproducts: a sum is covered by its two injections. This is the syntactic site of Spiwack's post (see the module header) -- the free bicartesian closed category Syntax is one such category, with the booleans the sum TermF + TermF covered by true and false.

Read p a as the ways of producing a result of type a, and the module header's two failures become concrete: too many is two elements of p Bool with the same branches, so a proof by cases establishes nothing; too few is a pair of branches with no conditional, so if-then-else is not definable.

One caveat, and a real one: Site's Stability law does not hold for this coverage as declared. Covers live only at objects whose shape is syntactically x + y, so stability would need every arrow into a sum to decompose its domain -- that is extensivity, and a free bicartesian category is not extensive. Two witnesses: id ||| lft at (u + u) + u ~> u + u needs only coproducts, and its restriction to the left summand is id, which factors through neither injection; and with a richer constraint list mempty :: UnitF ~> u + u has a source that is not a sum at all, so no cover is even available. Nothing here breaks -- glue's laws below are the coproduct's universal property and need no stability, and FREE is deliberately not a HasFiniteCovers, so the topology machinery is never instantiated at it -- but this coverage does not generate a Grothendieck topology, and the licence that HasFiniteCovers's covers gives -- to check only the covers it lists -- does not extend to it.

Being a sheaf is exactly p Bool ≅ p TermF × p TermF: every pair of branches has a conditional, and only one. On a representable that conditional is |||, which is why glue below is [t, e]; the conditional on a test f :: c ~> Bool with branches over c is either, which needs the distributive law as well.

The free category cannot list the covers of an arbitrary object, so this is a Site and not a HasFiniteCovers.

Instances

Instances details
Elem HasBinaryCoproducts cs => Site Sums (FREE cs p) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

Methods

legArrow :: forall (a :: FREE cs p) c (x :: FREE cs p). Leg Sums (FREE cs p) a c x -> x ~> a Source Github #

legs :: forall (a :: FREE cs p) c. Cover Sums (FREE cs p) a c -> [SomeLeg Sums (FREE cs p) a c] Source Github #

(Elem HasBinaryCoproducts cs, Elem HasInitialObject cs, CategoryOf j) => Sheaf Sums (Yo x ('OP b) :: FREE cs p -> j -> Type) Source Github #

Sums are colimits, so the representables are sheaves for Sums: gluing is ||| on the contravariant component.

The initial object is needed, even though the coproduct alone builds the gluing. An element of Yo x (OP b) at z carries a second, covariant component b ~> d, and a family over the two injections carries one of those per leg, while the glued element can carry only one. What forces the two to agree is the matching condition, and the two injections overlap only at the initial object: lft . initiate = rgt . initiate, so a matching family must take equal values there, and the first components being initiate either way leaves exactly the agreement of the second. Without an initial object the injections have no overlap at all, every family is vacuously matching, and restriction fails for any j with a hom-set bigger than one.

The decision procedure in Proarrow.Category.Enriched.Finitary.Sheaf does not need this, because it reads the condition off the generated sieve, which carries every arrow of j and so ties the covariant components together on its own.

Instance details

Defined in Proarrow.Category.Sheaf

Methods

glue :: forall (a :: FREE cs p) c (b0 :: j). (Ob a, Ob b0) => Cover Sums (FREE cs p) a c -> (forall (x0 :: FREE cs p). Leg Sums (FREE cs p) a c x0 -> Yo x ('OP b) x0 b0) -> Yo x ('OP b) a b0 Source Github #

data Cover Sums (FREE cs p) (a :: FREE cs p) c Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Cover Sums (FREE cs p) (a :: FREE cs p) c where
data Leg Sums (FREE cs p) (a :: FREE cs p) c (z :: FREE cs p) Source Github # 
Instance details

Defined in Proarrow.Category.Sheaf

data Leg Sums (FREE cs p) (a :: FREE cs p) c (z :: FREE cs p) where

data Summands (x :: k) (y :: k) Source Github #

The name of the cover of x + y by its injections, whose Cover constructor is BySummands and whose Leg constructors are AtLeft and AtRight.