# Introduction

Category theory was developed in the 1940's by _Eilenberg_ and _MacLane_. Eilenberg was an algebraic topologist and MacLane was an algebraist. They both realized that they were doing the same calculations in different areas of mathematics, which led them to lay the foundations of category theory.

Broadly, category theory is a convenient and powerful conceptual framework and a formal language for studying and discussing structures and systems of structures. The language of category theory has been used to formalize concepts of other high-level abstractions such as sets, rings, and groups.

Category theory allows us to formulate definitions and theories of concepts, to analyze the coherence of existing formulations, to discover and exploit relations with other fields, to deal with abstraction and representation independence, to formulate conjectures and research directions, to unify concepts.

In CS, category theory contributes to areas that include automata theory, domain theory, functional programming, polymorphism, semantics, type theory.

In programming language theory, category theory can be viewed as a formalization of operations on data types and a foundational theory of functions, providing the general framework for functional programming. CT has hugely influenced functional programming language Haskell, providing it with the solution to pure I/O handling in the form of monads.

Category theory may be used as an axiomatic foundation for mathematics, thereby replacing, or at least, providing an alternative to set theory.
