natural deduction metalanguage, practical foundations
type theory (dependent, intensional, observational type theory, homotopy type theory)
computational trinitarianism = propositions as types +programs as proofs +relation type theory/category theory
In computer science, a monad describes a “notion of computation”. Formally, it is a map that
sends every type of some given programming language to a new type (called the “type of -computations with values in ”);
equipped with a rule for composing two functions of the form (called Kleisli functions) and to a function (their Kleisli composition);
in a way that is associative in the evident sense and unital with respect to a given unit function called , to be thought of as taking a value to the pure computation that simply returns that value.
This is essentially the same structure as a monad in category theory, but presented differently; see below for the precise relationship.
Monads provide one way to “embed imperative programming? in functional programming”, and are used that way notably in the programming language Haskell. (But monads, as well as comonads and related structures, exist much more generally in programming languages; an exposition is in (Harper)).
For instance when the monad forms product types with some fixed type that carries the structure of a monoid, then a Kleisli function may be thought of as a function that produces a “side effect” output of type . The Kleisli composition of two functions and then not only evaluates the two programs in sequence but also combines their -output using the monoid operation of ; so if and then the final result of will be . For example, might be the set of strings of characters, and the monoid operation that of concatenation of strings (i.e. is the free monoid on the type of characters). If the software is designed such that values of type computed in this way appear on the user’s scteen or are written to memory, then this is a way to encode input/output in functional programming (see the IO monad? below).
But monads have plenty of further uses. They are as ubiquituous (sometimes in disguise) in computer science as monads in the sense of category theory are (sometimes in disguise) in category theory. This is no coincidence, see Relation to monads in category theory below.
In computer science, a programming language may be formalised or studied by means of a category, called the syntactic category , whose
morphisms are the terms or programs (or an equivalence class of such) that takes a value of type as input and returns a value of type .
This point of view (see computational trinitarianism) is particularly useful when studying purely functional programming languages.
Under this relation between type theory and category theory monads on the type system in the sense of computer science are monads in the sense of category theory, being certain endofunctors
on the syntactic category. This functor
the unit natural transformation of the monad provides for each type a component morphism ;
the multiplication natural transformation of the monad provides for each object a morphism which induces the Kleisli composition by the formula
Here the morphism in the middle of the last line makes use of the fact that is indeed a functor and hence may also be applied to morphisms / functions between types. The last morphism is the one that implements the ”-computation”.
The monads arising this way in computer science are usually required also to interact nicely with the structure of the programming language, as encoded in the structure of its syntactic category; in most cases, terms of the language will be allowed to take more than one input, so the category will be at least monoidal, and the corresponding kind of ‘nice’ interaction corresponds to the monad’s being a strong monad.
A number of monads are definable in terms of standard type-forming operations, such as the maybe monad?, the reader monad?, the writer monad?, and the state monad?.
Other monads may be supplied “axiomatically” by the programming language, such as the IO monad? in Haskell.
Equipping homotopy type theory (say implemented as a programming language concretely in Coq or Agda) with two axiomatic idempotent monads, denoted and , with some additional data and relations, turns it into cohesive homotopy type theory. See also modal type theory.
Examples of (co)monads in type theory appear in
The original reference for monads as ‘notions of computation’ is
Expositions are in
The specification of monads in Haskell is at
Discussion of aspects of quantum computing in terms of monads in functional programming are in