A lot of this is sourced from Category Theory for Programming

The power of category theory arises from abstraction: by boiling down constructions to their essence, analogous situations can be formally identified using category theory.

In essence, a simple collection which can be thought of as a graph. Three components

- A collection of objects (nodes)
- A collection of morphisms (edges).
- If $f$ is a morphism with source C and target B, we write $f:C→B$

- A notion of composition of morphisms.
- If we have $g:A→B$ and $f:B→C$, they can be composed resulting in a morphism $f∘g:A→C$
- Composition of morphisms needs to be associative. Typically applied right to left

## Categories

A category $C$ consists of

- A collection of objects, denoted by $C_{0}$
- For any given $X,Y∈C_{0}$, a collection of morphisms from $X$ to $Y$ denoted by $hom_{C}(X,Y)$ or $C(X,Y)$ or even $X→Y$
- An identity morphism for each object $X∈C_{0}$ such that $Id_{X}∈hom_{C}(X,X)$
- A binary infix composition operator $∘$ that takes $hom(Y,Z)→hom(Y,Z)→hom(X,Z)$ (this can be thought of as $X→Y∧Y→Z⟹X→Z$)

See also: functional programming, Homotopy Theory