A morphism that maps every object of its domain to every object of its co-domain.

Monomorphism (injective)

A morphism mapping a domain to a strict-subset of the objects in the co-domain, i.e. there are objects in the co-domain which cannot be mapped to.

When moving between categories via monomorphisms, we can simplify to make some compositions equal even if the morphisms are not actually equal, e.g. f x = mod x 20, g1 x = x*2, and g2 x = if x < 20 then x*2 else x*3, we can consider g1 and g2 to be equal if they are composed after f: g1 . f = g2 . f => g1 = g2.

In other circumstances f . g1 = f . g2 => g1 = g2 might be a valid simplification.

Isomorphism

A morphism with an inverse morphism: we can jump back and forth between the domain and co-domain. NB. It may still be a monomorphism so the categories may not be “identical”.

TODO: partial order (poset), preorder (proset), lattice

Set

Functor

Goes between categories. In Haskell terms, the Functor typeclass serves to “lift” a normal function into a Functor instance, thereby mapping a morphism in one (Hask sub-)category over to a morphism in another.