An arrow in a Category is a monomorphism (“mono”, drawn or ) if for every object and every pair ,
Equivalently, post-composition is injective for every . To show is not mono, exhibit two different “shapes” in that maps to the same shape in .
Sources: DaoFP §2.4 (“Monomorphisms”), Exercise 2.4.1; Kittenlab Lecture 14 (subobjects as injections); 7 Sketches §7.2 (subobjects), §1.4.2 (epi-mono factorization); CTfS Definition 2.7.5.3, Propositions 2.7.5.4–2.7.5.5, Corollary 2.7.5.8
Motivation (DaoFP). injectBool :: Bool -> Int (True ↦ 1, False ↦ 0) doesn’t discard information — it embeds a two-element shape in the integers; even :: Int -> Bool does discard (it abstracts). In , injective means for global elements ; since not every category has a terminal object, monomorphisms replace global elements by arbitrary shapes .
- In , monos are exactly the injections. Any arrow from the Terminal Object is mono (DaoFP Exercise 2.4.1).
- “In category theory objects are indivisible, so we can only talk about sub-objects using arrows”: a mono picks a Subobject of in the shape of ; in a Topos subobjects are classified by the Subobject Classifier.
- Mono + epi does not imply Isomorphism in general (e.g. in rings); it does in (Bijection). A section is always mono.
- In a mono is injective by testing with ; conversely an injective with must have pointwise (CTfS Proposition 2.7.5.4). Pulling back a mono along any map gives a mono (CTfS Proposition 2.7.5.5), which is what makes ologs like “a rib which is made by a cow” well-labelled (Injection).
- Every function factors as an epi followed by a mono (Epi-Mono Factorization).
- Via pullbacks (7 Sketches Definition 7.5): is mono iff the square with twice on top/left and twice on right/bottom is a Pullback — i.e. the kernel pair of is trivial. From this, -monos are the injections (7S Exercise 7.6), and monos are stable under pullback (7S Exercise 7.8, via the Pasting Lemma for Pullbacks). In a Topos every mono is the pullback of along its characteristic map (Subobject Classifier).
Docs: FinSets · C-set morphisms — Kittenlab Lecture 14
using Catlab
is_monic(FinFunction([1, 3], 3)) # true: injective
is_monic(FinFunction([1, 1], 3)) # false#check CategoryTheory.Mono -- class Mono f : ∀ g h, g ≫ f = h ≫ f → g = h
#check @CategoryTheory.mono_iff_injective
#check @CategoryTheory.mono_compinjectBool :: Bool -> Int -- a monomorphism in Hask
injectBool b = if b then 1 else 0
-- in Hask, mono-ness of f amounts to injectivity; on a finite domain:
isMono :: (Eq a, Eq b) => [a] -> (a -> b) -> Bool
isMono as f = and [ x == y | x <- as, y <- as, f x == f y ]