###### Definition

A monad in Haskell is defined to be a type class with two methods:

> $\mathbf{class}\;Monad\;m\;\mathbf{where}$

> $\gt\gt =::ma\to(a\to mb)\to mb$

> $return::a\to ma$

such that

> $x\gt\gt=f\equiv fx$

> $a\gt\gt=return\equiv a$

> $(a\gt\gt=f)\gt\gt=g\equiv a\gt\gt =(\lambda x\to fx\gt\gt =g)$

###### Remark

$m$ being a monad $(m:a\to a, \mu:m^2\to m,\epsilon:id_a\to m)$ on some object $a$ in a 2-category can be expressed in Haskell by

> $\mathbf{class}\;Monad\;m\;\mathbf{where}$

> $map::(a\to b)\to ma\to mb$

> $return::a\to ma$

> $join:: m(ma)\to ma$

We have the following translation of Haskell and category theoretical language?:

> $join:=\mu$

> $return :=\epsilon$

Then from the category theoretical properties of $(m,\mu,\epsilon)$ we obtain (mixing the two languages)

> $map\; g\circ \epsilon\equiv \epsilon\circ g$

> $map \; \circ \mu\equiv \mu\circ map(map\; g)$

> $\mu\circ map\; \mu \equiv \mu\circ \mu$

> $\mu\circ \epsilon\equiv \mu\circ map\;\epsilon =id$

And with the following definitions

> $map\; f :=(\lambda\to a\gt\gt=(return\circ f))$

> $join \; a=a\gt\gt id$

or alternatively

> $a\gt\gt =f:=join (map\;fa)$

one can verify that the two given definitions of a monad are equivalent.