Monad transformer: Difference between revisions

Content deleted Content added
No edit summary
Line 35:
*<math>\mathrm{bind}: \mathrm{M} \left( A^{?} \right) \rarr \left( A \rarr \mathrm{M} \left( B^{?} \right) \right) \rarr \mathrm{M} \left( B^{?} \right) = a \mapsto f \mapsto \mathrm{bind} \, a \, \left(a' \mapsto \begin{cases} \mbox{return Nothing} & \mbox{if } a' = \mathrm{Nothing}\\ f \, a'' & \mbox{if } a' = \mathrm{Just} \, a'' \end{cases} \right)</math>
*<math>\mathrm{lift}: \mathrm{M} (A) \rarr \mathrm{M} \left( A^{?} \right) = m \mapsto \mathrm{bind} \, m \, (x \mapsto \mathrm{return} (\mathrm{Just} \, x))</math>
 
=== The exception monad transformer ===
Given any monad <math>\mathrm{M} \, A</math>, the exception monad transformer <math>\mathrm{M} (A + E)</math> (where <math>E</math> is the type of exceptions) is defined by:
*<math>\mathrm{return}: A \rarr \mathrm{M} (A + E) = a \mapsto \mathrm{return} (\mathrm{value}\,a)</math>
*<math>\mathrm{bind}: \mathrm{M} (A + E) \rarr (A \rarr \mathrm{M} (B + E)) \rarr \mathrm{M} (B + E) = a \mapsto f \mapsto \mathrm{bind} \, a \,\left( a' \mapsto \begin{cases} \mbox{return err } e & \mbox{if } a' = \mathrm{err} \, e\\ f \, a'' & \mbox{if } a' = \mathrm{value} \, a'' \end{cases} \right)</math>
*<math>\mathrm{lift}: \mathrm{M} (A) \rarr \mathrm{M} (A + E) = m \mapsto \mathrm{bind} \, m \, (x \mapsto \mathrm{return} (\mathrm{value} \, x))</math>
 
== See also ==