proarrow
Safe HaskellNone
LanguageGHC2024

Proarrow.Limit.Equalizer

Description

type depends on the given arrows, so it is hidden behind an existential) and factorEqualizer for the universal property.

Synopsis

Documentation

class CategoryOf k => HasEqualizers k where Source Github #

Equalizers are an inherently dependently typed concept: The type of the base object depends on the values of the given arrows. But at runtime we can still calculate the arrow and the type, which we hide behind an existential.

Methods

equalize :: forall (a :: k) (b :: k) r. (a ~> b) -> (a ~> b) -> (forall (e :: k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: k) (x :: k) (e' :: k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

factorEqualizer incl h requires incl to be mono and h's image to lie within incl's image; incl is typically (though not necessarily) the equalizer arrow produced by equalize.

Instances

Instances details
HasEqualizers BOOL Source Github #

factorEqualizer incl h requires h's image to lie within incl's. Since BOOL is the 2-element total order FLS <= TRU, that means h's domain is <= incl's domain. That's always true when incl came from equalize (which only ever produces the identity), but since BOOL is totally ordered we can case on the shapes directly (at most 5 are reachable, since both share a codomain).

Instance details

Defined in Proarrow.Limit.Equalizer

Methods

equalize :: forall (a :: BOOL) (b :: BOOL) r. (a ~> b) -> (a ~> b) -> (forall (e :: BOOL). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: BOOL) (x :: BOOL) (e' :: BOOL). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasEqualizers COST Source Github #

COST is thin and totally ordered, so equalizers are trivial. factorEqualizer incl h just compares e and e' directly (their common bound x does not matter), erroring when and only when e' is finite and strictly less than e, or e is INF while e' is finite.

Instance details

Defined in Proarrow.Category.Instance.Cost

Methods

equalize :: forall (a :: COST) (b :: COST) r. (a ~> b) -> (a ~> b) -> (forall (e :: COST). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: COST) (x :: COST) (e' :: COST). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasEqualizers FINHASK Source Github #
>>> let f :: FinHask (FH (Fin 4)) (FH (Fin 3)) = fromList [(0,0), (1,1), (2,1), (3,0)]
>>> let g :: FinHask (FH (Fin 4)) (FH (Fin 3)) = fromList [(0,2), (1,0), (2,1), (3,0)]
>>> let h :: FinHask (FH (Fin 3)) (FH (Fin 4)) = fromList [(0,3), (1,2), (2,3)]
>>> (equalize f g \incl -> let p = factorEqualizer incl h in P.show (incl, p, incl . p)) :: P.String
"(fromList [(0,2),(1,3)],fromList [(0,1),(1,0),(2,1)],fromList [(0,3),(1,2),(2,3)])"
Instance details

Defined in Proarrow.Category.Instance.FinHask

Methods

equalize :: forall (a :: FINHASK) (b :: FINHASK) r. (a ~> b) -> (a ~> b) -> (forall (e :: FINHASK). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: FINHASK) (x :: FINHASK) (e' :: FINHASK). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasEqualizers FINSET Source Github #
>>> import Data.Fin
>>> import Data.Type.Nat
>>> import Data.Vec.Lazy
>>> let f :: FinSet (FS Nat4) (FS Nat3) = FinSet $ fin0 ::: fin1 ::: fin1 ::: fin0 ::: VNil
>>> let g :: FinSet (FS Nat4) (FS Nat3) = FinSet $ fin2 ::: fin0 ::: fin1 ::: fin0 ::: VNil
>>> let h :: FinSet (FS Nat3) (FS Nat4) = FinSet $ fin3 ::: fin2 ::: fin3 ::: VNil
>>> (equalize f g \incl -> let p = factorEqualizer incl h in P.show (incl, p, incl . p)) :: P.String
"(FinSet {unFinSet = 2 ::: 3 ::: VNil},FinSet {unFinSet = 1 ::: 0 ::: 1 ::: VNil},FinSet {unFinSet = 3 ::: 2 ::: 3 ::: VNil})"
Instance details

Defined in Proarrow.Category.Instance.FinSet

Methods

equalize :: forall (a :: FINSET) (b :: FINSET) r. (a ~> b) -> (a ~> b) -> (forall (e :: FINSET). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: FINSET) (x :: FINSET) (e' :: FINSET). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasEqualizers () Source Github # 
Instance details

Defined in Proarrow.Limit.Equalizer

Methods

equalize :: forall (a :: ()) (b :: ()) r. (a ~> b) -> (a ~> b) -> (forall (e :: ()). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: ()) (x :: ()) (e' :: ()). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

Indexed k => HasEqualizers (CODISCRETE k) Source Github # 
Instance details

Defined in Proarrow.Category.Instance.Discrete

Methods

equalize :: forall (a :: CODISCRETE k) (b :: CODISCRETE k) r. (a ~> b) -> (a ~> b) -> (forall (e :: CODISCRETE k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: CODISCRETE k) (x :: CODISCRETE k) (e' :: CODISCRETE k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

Indexed k => HasEqualizers (DISCRETE k) Source Github # 
Instance details

Defined in Proarrow.Category.Instance.Discrete

Methods

equalize :: forall (a :: DISCRETE k) (b :: DISCRETE k) r. (a ~> b) -> (a ~> b) -> (forall (e :: DISCRETE k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: DISCRETE k) (x :: DISCRETE k) (e' :: DISCRETE k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

(Fractional a, Eq a) => HasEqualizers (MatK a) Source Github #

The equalizer of two linear maps f, g :: M m ~> M n is the kernel of f - g: the subspace of M m on which they agree. Computed by row-reducing f - g to reduced row echelon form; the free (non-pivot) columns of the result index a basis of the kernel.

>>> import Data.Vec.Lazy (Vec(..))
>>> let f = Mat @(S (S Z)) @(S Z) ((1 ::: 2 ::: VNil) ::: VNil) :: Mat (M (S (S Z))) (M (S Z) :: MatK P.Double)
>>> let g = Mat @(S (S Z)) @(S Z) ((3 ::: 0 ::: VNil) ::: VNil) :: Mat (M (S (S Z))) (M (S Z) :: MatK P.Double)
>>> let h = Mat @(S Z) @(S (S Z)) ((1 ::: VNil) ::: (1 ::: VNil) ::: VNil) :: Mat (M (S Z)) (M (S (S Z)) :: MatK P.Double)
>>> (equalize f g \incl@(Mat inclv) -> case factorEqualizer incl h of p@(Mat pv) -> P.show (inclv, pv, unMat (incl . p))) :: P.String
"((1.0 ::: VNil) ::: (1.0 ::: VNil) ::: VNil,(1.0 ::: VNil) ::: VNil,(1.0 ::: VNil) ::: (1.0 ::: VNil) ::: VNil)"
Instance details

Defined in Proarrow.Category.Instance.Mat

Methods

equalize :: forall (a0 :: MatK a) (b :: MatK a) r. (a0 ~> b) -> (a0 ~> b) -> (forall (e :: MatK a). (e ~> a0) -> r) -> r Source Github #

factorEqualizer :: forall (e :: MatK a) (x :: MatK a) (e' :: MatK a). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasCoequalizers k => HasEqualizers (OPPOSITE k) Source Github # 
Instance details

Defined in Proarrow.Colimit.Coequalizer

Methods

equalize :: forall (a :: OPPOSITE k) (b :: OPPOSITE k) r. (a ~> b) -> (a ~> b) -> (forall (e :: OPPOSITE k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: OPPOSITE k) (x :: OPPOSITE k) (e' :: OPPOSITE k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasEqualizers (ORDINAL n) Source Github #

LTE is thin, so equalizers are trivial. factorEqualizer incl h just needs h's domain to be <= incl's domain. Since both share the codomain x, this can only fail when incl's domain is OZ (nothing below it) but h's domain is a successor (necessarily above OZ).

Instance details

Defined in Proarrow.Category.Instance.Ordinal

Methods

equalize :: forall (a :: ORDINAL n) (b :: ORDINAL n) r. (a ~> b) -> (a ~> b) -> (forall (e :: ORDINAL n). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: ORDINAL n) (x :: ORDINAL n) (e' :: ORDINAL n). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

HasEqualizers k => HasEqualizers (PROD k) Source Github #

Equalizers are unchanged by making the tensor the product.

Instance details

Defined in Proarrow.Limit.Equalizer

Methods

equalize :: forall (a :: PROD k) (b :: PROD k) r. (a ~> b) -> (a ~> b) -> (forall (e :: PROD k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: PROD k) (x :: PROD k) (e' :: PROD k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

(Enumerable j, Enumerable k) => HasEqualizers (FINITARY j k) Source Github #

Equalizers of finitary profunctors between finite categories: at each pair of objects, keep the indices on which the two natural transformations agree, and reify the table.

Instance details

Defined in Proarrow.Category.Enriched.Finitary.Topos

Methods

equalize :: forall (a :: FINITARY j k) (b :: FINITARY j k) r. (a ~> b) -> (a ~> b) -> (forall (e :: FINITARY j k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: FINITARY j k) (x :: FINITARY j k) (e' :: FINITARY j k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

(HasEqualizers j, HasEqualizers k) => HasEqualizers (COPRODUCT j k) Source Github #

Morphisms of COPRODUCT never cross sides, so this is a straight case split reusing either j's or k's own equalizer.

Instance details

Defined in Proarrow.Category.Instance.Coproduct

Methods

equalize :: forall (a :: COPRODUCT j k) (b :: COPRODUCT j k) r. (a ~> b) -> (a ~> b) -> (forall (e :: COPRODUCT j k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: COPRODUCT j k) (x :: COPRODUCT j k) (e' :: COPRODUCT j k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

(HasEqualizers k1, HasEqualizers k2) => HasEqualizers (k1, k2) Source Github # 
Instance details

Defined in Proarrow.Limit.Equalizer

Methods

equalize :: forall (a :: (k1, k2)) (b :: (k1, k2)) r. (a ~> b) -> (a ~> b) -> (forall (e :: (k1, k2)). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: (k1, k2)) (x :: (k1, k2)) (e' :: (k1, k2)). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

(Site t k, Enumerable j, Enumerable k) => HasEqualizers (SHEAVES t j k) Source Github #

Equalizers as in FINITARY, by equalizeNat; the result is a sheaf for every coverage, which testEqualizersAreSheaves checks by enumeration.

Instance details

Defined in Proarrow.Category.Enriched.Finitary.Sheaf

Methods

equalize :: forall (a :: SHEAVES t j k) (b :: SHEAVES t j k) r. (a ~> b) -> (a ~> b) -> (forall (e :: SHEAVES t j k). (e ~> a) -> r) -> r Source Github #

factorEqualizer :: forall (e :: SHEAVES t j k) (x :: SHEAVES t j k) (e' :: SHEAVES t j k). (e ~> x) -> (e' ~> x) -> e' ~> e Source Github #

thinEqualize :: forall {k} (a :: k) (b :: k) r. Thin k => (a ~> b) -> (a ~> b) -> (forall (e :: k). (e ~> a) -> r) -> r Source Github #

In a thin category, arrows don't carry information, so equalizers are just identities.

pullbackDefault :: forall {k} (o :: k) (a :: k) (b :: k) r. (HasEqualizers k, HasProducts k) => (a ~> o) -> (b ~> o) -> (forall (p :: k). (p ~> a) -> (p ~> b) -> r) -> r Source Github #

Standalone helper (not a class method) usable as the default implementation of pullback wherever (HasEqualizers k, HasProducts k) happen to hold. Not every HasPullbacks instance needs it or is required to have it.

factorPullbackDefault :: forall {k} (a :: k) (b :: k) (p :: k) (q :: k). (HasEqualizers k, HasProducts k) => (p ~> a) -> (p ~> b) -> (q ~> a) -> (q ~> b) -> q ~> p Source Github #

Given a pullback's own legs p1, p2 and a compatible cone k1, k2 on some q (with f . k1 == g . k2 for whichever cospan p1, p2 are a pullback of), produces the unique q ~> p through which the cone factors. Standalone helper (not a class method), usable as the default implementation of factorPullback wherever (HasEqualizers k, HasProducts k) happen to hold, like pullbackDefault itself.

kernel :: forall k (a :: k) (b :: k) r. (HasEqualizers k, HasZeroObject k) => (a ~> b) -> (forall (e :: k). (e ~> a) -> r) -> r Source Github #