Why this course? What will we cover? What do we require?
A graph is a collection G0 of vertices and a collection G1 of arrows. The structure of the graph is captured in the existence of two functions, that we shall call source and target, both going from G1 to G0. In other words, each arrow has a source and a target.
We denote by Ar(v,w) the collection of arrows with source v and target w.
A category is a graph with some special structure:
- Each Ar(v,w) is a set and equipped with a composition operation Ar(u,v) x Ar(v,w) -> Ar(u,w). In other words, any two arrows, such that the target of one is the source of the other, can be composed to give a new arrow with target and source from the ones left out.
u -> v -> w => u -> w
- The composition of arrows is associative.
- Each vertex v has a dedicated arrow 1v with source and target v, called the identity arrow.
- Each identity arrow is a left- and right-identity for the composition operation.
- The empty category with no vertices and no arrows.
- The category 1 with a single vertex and only its identity arrow.
- The category 2 with two objects, their identity arrows and the arrow a -> b.
- For vertices take vector spaces. For arrows, take linear maps. This is a category, the identity arrow is just the identity map f(x) = x and composition is just function composition.
- For vertices take finite sets. For arrows, take functions.
- For vertices take logical propositions. For arrows take proofs in propositional logic. The identity arrow is the empty proof: P proves P without an actual proof. And if you can prove P using Q and then R using P, then this composes to a proof of R using Q.
- For vertices, take data types. For arrows take (computable) functions. This forms a category, in which we can discuss an abstraction that mirrors most of Haskell. There are issues making Haskell not quite a category on its own, but we get close enough to draw helpful conclusions and analogies.