cat theory tweaks
[lambda.git] / advanced_topics / monads_in_category_theory.mdwn
index 044d973..588d1a3 100644 (file)
@@ -33,8 +33,8 @@ Some examples of monoids are:
 
 *      finite strings of an alphabet `A`, with <code>&#8902;</code> being concatenation and `z` being the empty string
 *      all functions <code>X&rarr;X</code> over a set `X`, with <code>&#8902;</code> being composition and `z` being the identity function over `X`
-*      the natural numbers with <code>&#8902;</code> being plus and `z` being `0` (in particular, this is a **commutative monoid**). If we use the integers, or the naturals mod n, instead of the naturals, then every element will have an inverse and so we have not merely a monoid but a **group**.)
-*      if we let <code>&#8902;</code> be multiplication and `z` be `1`, we get different monoids over the same sets as in the previous item.
+*      the natural numbers with <code>&#8902;</code> being plus and `z` being 0 (in particular, this is a **commutative monoid**). If we use the integers, or the naturals mod n, instead of the naturals, then every element will have an inverse and so we have not merely a monoid but a **group**.
+*      if we let <code>&#8902;</code> be multiplication and `z` be 1, we get different monoids over the same sets as in the previous item.
 
 Categories
 ----------
@@ -58,7 +58,7 @@ To have a category, the elements and morphisms have to satisfy some constraints:
 
 These parallel the constraints for monoids. Note that there can be multiple distinct morphisms between an element `E` and itself; they need not all be identity morphisms. Indeed from (iii) it follows that each element can have only a single identity morphism.
 
-A good intuitive picture of a category is as a generalized directed graph, where the category elements are the graph's nodes, and there can be multiple directed edges between a given pair of nodes, and nodes can also have multiple directed edges to themselves. (Every node must have at least one such, which is that node's identity morphism.)
+A good intuitive picture of a category is as a generalized directed graph, where the category elements are the graph's nodes, and there can be multiple directed edges between a given pair of nodes, and nodes can also have multiple directed edges to themselves. Morphisms correspond to directed paths of length &ge; 0 in the graph.
 
 
 Some examples of categories are:
@@ -67,7 +67,7 @@ Some examples of categories are:
 
 *      any monoid <code>(S,&#8902;,z)</code> generates a category with a single element `x`; this `x` need not have any relation to `S`. The members of `S` play the role of *morphisms* of this category, rather than its elements. All of these morphisms are understood to map `x` to itself. The result of composing the morphism consisting of `s1` with the morphism `s2` is the morphism `s3`, where <code>s3=s1&#8902;s2</code>. The identity morphism for the (single) category element `x` is the monoid's identity `z`.
 
-*      a **preorder** is a structure <code>(S, &le;)</code> consisting of a reflexive, transitive, binary relation on a set `S`. It need not be connected (that is, there may be members `x`,`y` of `S` such that neither <code>x&le;y</code> nor <code>y&le;x</code>). It need not be anti-symmetric (that is, there may be members `s1`,`s2` of `S` such that <code>s1&le;s2</code> and <code>s2&le;s1</code> but `s1` and `s2` are not identical). Some examples:
+*      a **preorder** is a structure <code>(S, &le;)</code> consisting of a reflexive, transitive, binary relation on a set `S`. It need not be connected (that is, there may be members `s1`,`s2` of `S` such that neither <code>s1&le;s2</code> nor <code>s2&le;s1</code>). It need not be anti-symmetric (that is, there may be members `s1`,`s2` of `S` such that <code>s1&le;s2</code> and <code>s2&le;s1</code> but `s1` and `s2` are not identical). Some examples:
 
        *       sentences ordered by logical implication ("p and p" implies and is implied by "p", but these sentences are not identical; so this illustrates a pre-order without anti-symmetry)
        *       sets ordered by size (this illustrates it too)
@@ -136,7 +136,7 @@ Then <code>(&eta; F)</code> is a natural transformation from the (composite) fun
 And <code>(K &eta;)</code> is a natural transformation from the (composite) functor `KG` to the (composite) functor `KH`, such that where `C1` is an element of category <b>C</b>, <code>(K &eta;)[C1] = K(&eta;[C1])</code>---that is, the morphism in <b>E</b> that `K` assigns to the morphism <code>&eta;[C1]</code> of <b>D</b>.
 
 
-<code>(&phi; -v- &eta;)</code> is a natural transformation from `G` to `J`; this is known as a "vertical composition". We will rely later on this, where <code>f:C1&rarr;C2</code>:
+<code>(&phi; -v- &eta;)</code> is a natural transformation from `G` to `J`; this is known as a "vertical composition". For any morphism <code>f:C1&rarr;C2</code> in <b>C</b>:
 
 <pre>
        &phi;[C2] &#8728; H(f) &#8728; &eta;[C1] = &phi;[C2] &#8728; H(f) &#8728; &eta;[C1]
@@ -186,155 +186,239 @@ In earlier days, these were also called "triples."
 
 A **monad** is a structure consisting of an (endo)functor `M` from some category <b>C</b> to itself, along with some natural transformations, which we'll specify in a moment.
 
-Let `T` be a set of natural transformations <code>&phi;</code>, each being between some (variable) functor `F` and another functor which is the composite `MF'` of `M` and a (variable) functor `F'`. That is, for each element `C1` in <b>C</b>, <code>&phi;</code> assigns `C1` a morphism from element `F(C1)` to element `MF'(C1)`, satisfying the constraints detailed in the previous section. For different members of `T`, the relevant functors may differ; that is, <code>&phi;</code> is a transformation from functor `F` to `MF'`, <code>&gamma;</code> is a transformation from functor `G` to `MG'`, and none of `F`, `F'`, `G`, `G'` need be the same.
+Let `T` be a set of natural transformations <code>&phi;</code>, each being between some arbitrary endofunctor `F` on <b>C</b> and another functor which is the composite `MF'` of `M` and another arbitrary endofunctor `F'` on <b>C</b>. That is, for each element `C1` in <b>C</b>, <code>&phi;</code> assigns `C1` a morphism from element `F(C1)` to element `MF'(C1)`, satisfying the constraints detailed in the previous section. For different members of `T`, the relevant functors may differ; that is, <code>&phi;</code> is a transformation from functor `F` to `MF'`, <code>&gamma;</code> is a transformation from functor `G` to `MG'`, and none of `F`, `F'`, `G`, `G'` need be the same.
 
-One of the members of `T` will be designated the "unit" transformation for `M`, and it will be a transformation from the identity functor `1C` for <b>C</b> to `M(1C)`. So it will assign to `C1` a morphism from `C1` to `M(C1)`.
+One of the members of `T` will be designated the `unit` transformation for `M`, and it will be a transformation from the identity functor `1C` for <b>C</b> to `M(1C)`. So it will assign to `C1` a morphism from `C1` to `M(C1)`.
 
-We also need to designate for `M` a "join" transformation, which is a natural transformation from the (composite) functor `MM` to `M`.
+We also need to designate for `M` a `join` transformation, which is a natural transformation from the (composite) functor `MM` to `M`.
 
 These two natural transformations have to satisfy some constraints ("the monad laws") which are most easily stated if we can introduce a defined notion.
 
-Let <code>&phi;</code> and <code>&gamma;</code> be members of `T`, that is they are natural transformations from `F` to `MF'` and from `G` to `MG'`, respectively. Let them be such that `F' = G`. Now `(M &gamma;)` will also be a natural transformation, formed by composing the functor `M` with the natural transformation <code>&gamma;</code>. Similarly, `(join G')` will be a natural transformation, formed by composing the natural transformation `join` with the functor `G'`; it will transform the functor `MMG'` to the functor `MG'`. Now take the vertical composition of the three natural transformations `(join G')`, <code>(M &gamma;)</code>, and <code>&phi;</code>, and abbreviate it as follows:
+Let <code>&phi;</code> and <code>&gamma;</code> be members of `T`, that is they are natural transformations from `F` to `MF'` and from `G` to `MG'`, respectively. Let them be such that `F' = G`. Now <code>(M &gamma;)</code> will also be a natural transformation, formed by composing the functor `M` with the natural transformation <code>&gamma;</code>. Similarly, `(join G')` will be a natural transformation, formed by composing the natural transformation `join` with the functor `G'`; it will transform the functor `MMG'` to the functor `MG'`. Now take the vertical composition of the three natural transformations `(join G')`, <code>(M &gamma;)</code>, and <code>&phi;</code>, and abbreviate it as follows. Since composition is associative I don't specify the order of composition on the rhs.
 
 <pre>
        &gamma; <=< &phi;  =def.  ((join G') -v- (M &gamma;) -v- &phi;)
 </pre>
 
-Since composition is associative I don't specify the order of composition on the rhs.
+In other words, `<=<` is a binary operator that takes us from two members <code>&phi;</code> and <code>&gamma;</code> of `T` to a composite natural transformation. (In functional programming, at least, this is called the "Kleisli composition operator". Sometimes it's written <code>&phi; >=> &gamma;</code> where that's the same as <code>&gamma; &lt;=&lt; &phi;</code>.)
 
-In other words, `<=<` is a binary operator that takes us from two members <code>&phi;</code> and <code>&gamma;</code> of `T` to a composite natural transformation. (In functional programming, at least, this is called the "Kleisli composition operator". Sometimes its written <code>&phi; >=> &gamma;</code> where that's the same as <code>&gamma; <=< &phi;</code>.)
-
-&phi; is a transformation from `F` to `MF'` which = `MG`; `(M &gamma;)` is a transformation from `MG` to `MMG'`; and `(join G')` is a transformation from `MMG'` to `MG'`. So the composite &gamma; <=< &phi; will be a transformation from `F` to `MG'`, and so also eligible to be a member of `T`.
+<code>&phi;</code> is a transformation from `F` to `MF'`, where the latter = `MG`; <code>(M &gamma;)</code> is a transformation from `MG` to `MMG'`; and `(join G')` is a transformation from `MMG'` to `MG'`. So the composite <code>&gamma; &lt;=&lt; &phi;</code> will be a transformation from `F` to `MG'`, and so also eligible to be a member of `T`.
 
 Now we can specify the "monad laws" governing a monad as follows:
 
+<pre>  
        (T, <=<, unit) constitute a monoid
+</pre>
 
-That's it. (Well, perhaps we're cheating a bit, because &gamma; <=< &phi; isn't fully defined on `T`, but only when `F` is a functor to `MF'` and `G` is a functor from `F'`. But wherever `<=<` is defined, the monoid laws are satisfied:
+That's it. Well, there may be a wrinkle here. I don't know whether the definition of a monoid requires the operation to be defined for every pair in its set. In the present case, <code>&gamma; &lt;=&lt; &phi;</code> isn't fully defined on `T`, but only when <code>&phi;</code> is a transformation to some `MF'` and <code>&gamma;</code> is a transformation from `F'`. But wherever `<=<` is defined, the monoid laws must hold:
 
-       (i) &gamma; <=< &phi; is also in T
-       (ii) (&rho; <=< &gamma;) <=< &phi;  =  &rho; <=< (&gamma; <=< &phi;)
-       (iii.1) unit <=< &phi;  =  &phi;                 (here &phi; has to be a natural transformation to M(1C))
-       (iii.2)                &phi;  =  &phi; <=< unit  (here &phi; has to be a natural transformation from 1C)
+<pre>
+           (i) &gamma; <=< &phi; is also in T
 
-If &phi; is a natural transformation from `F` to `M(1C)` and &gamma; is `(&phi; G')`, that is, a natural transformation from `PG` to `MG`, then we can extend (iii.1) as follows:
+          (ii) (&rho; <=< &gamma;) <=< &phi;  =  &rho; <=< (&gamma; <=< &phi;)
 
+       (iii.1) unit <=< &phi;  =  &phi;
+               (here &phi; has to be a natural transformation to M(1C))
+
+       (iii.2)                &rho;  =  &rho; <=< unit
+               (here &rho; has to be a natural transformation from 1C)
+</pre>
+
+If <code>&phi;</code> is a natural transformation from `F` to `M(1C)` and <code>&gamma;</code> is <code>(&phi; G')</code>, that is, a natural transformation from `FG'` to `MG'`, then we can extend (iii.1) as follows:
+
+<pre>
        &gamma; = (&phi; G')
          = ((unit <=< &phi;) G')
-         = ((join -v- (M unit) -v- &phi;) G')
-         = (join G') -v- ((M unit) G') -v- (&phi; G')
-         = (join G') -v- (M (unit G')) -v- &gamma;
-         ??
+         = (((join 1C) -v- (M unit) -v- &phi;) G')
+         = (((join 1C) G') -v- ((M unit) G') -v- (&phi; G'))
+         = ((join (1C G')) -v- (M (unit G')) -v- &gamma;)
+         = ((join G') -v- (M (unit G')) -v- &gamma;)
+         since (unit G') is a natural transformation to MG',
+         this satisfies the definition for &lt;=&lt;:
          = (unit G') <=< &gamma;
+</pre>
 
-where as we said &gamma; is a natural transformation from some `PG'` to `MG'`.
+where as we said <code>&gamma;</code> is a natural transformation from some `FG'` to `MG'`.
 
-Similarly, if &phi; is a natural transformation from `1C` to `MF'`, and &gamma; is `(&phi; G)`, that is, a natural transformation from `G` to `MF'G`, then we can extend (iii.2) as follows:
+Similarly, if <code>&rho;</code> is a natural transformation from `1C` to `MR'`, and <code>&gamma;</code> is <code>(&rho; G)</code>, that is, a natural transformation from `G` to `MR'G`, then we can extend (iii.2) as follows:
 
-       &gamma; = (&phi; G)
-         = ((&phi; <=< unit) G)
-         = (((join F') -v- (M &phi;) -v- unit) G)
-         = ((join F'G) -v- ((M &phi;) G) -v- (unit G))
-         = ((join F'G) -v- (M (&phi; G)) -v- (unit G))
-         ??
+<pre>
+       &gamma; = (&rho; G)
+         = ((&rho; <=< unit) G)
+         = (((join R') -v- (M &rho;) -v- unit) G)
+         = (((join R') G) -v- ((M &rho;) G) -v- (unit G))
+         = ((join (R'G)) -v- (M (&rho; G)) -v- (unit G))
+         since &gamma; = (&rho; G) is a natural transformation to MR'G,
+         this satisfies the definition &lt;=&lt;:
          = &gamma; <=< (unit G)
+</pre>
+
+where as we said <code>&gamma;</code> is a natural transformation from `G` to some `MR'G`.
+
+Summarizing then, the monad laws can be expressed as:
+
+<pre>
+       For all &rho;, &gamma;, &phi; in T for which &rho; <=< &gamma; and &gamma; <=< &phi; are defined:
+
+           (i) &gamma; <=< &phi; etc are also in T
+
+          (ii) (&rho; <=< &gamma;) <=< &phi;  =  &rho; <=< (&gamma; <=< &phi;)
 
-where as we said &gamma; is a natural transformation from `G` to some `MF'G`.
+       (iii.1) (unit G') <=< &gamma;  =  &gamma;
+               when &gamma; is a natural transformation from some FG' to MG'
 
+       (iii.2)                     &gamma;  =  &gamma; <=< (unit G)
+               when &gamma; is a natural transformation from G to some MR'G
+</pre>
 
 
 
-The standard category-theory presentation of the monad laws
------------------------------------------------------------
+Getting to the standard category-theory presentation of the monad laws
+----------------------------------------------------------------------
 In category theory, the monad laws are usually stated in terms of `unit` and `join` instead of `unit` and `<=<`.
 
-(*
+<!--
        P2. every element C1 of a category <b>C</b> has an identity morphism 1<sub>C1</sub> such that for every morphism f:C1&rarr;C2 in <b>C</b>: 1<sub>C2</sub> &#8728; f = f = f &#8728; 1<sub>C1</sub>.
        P3. functors "preserve identity", that is for every element C1 in F's source category: F(1<sub>C1</sub>) = 1<sub>F(C1)</sub>.
-*)
+-->
 
 Let's remind ourselves of some principles:
-       * composition of morphisms, functors, and natural compositions is associative
-       * functors "distribute over composition", that is for any morphisms f and g in F's source category: F(g &#8728; f) = F(g) &#8728; F(f)
-       * if &eta; is a natural transformation from F to G, then for every f:C1&rarr;C2 in F and G's source category <b>C</b>: &eta;[C2] &#8728; F(f) = G(f) &#8728; &eta;[C1].
 
+*      composition of morphisms, functors, and natural compositions is associative
+
+*      functors "distribute over composition", that is for any morphisms `f` and `g` in `F`'s source category: <code>F(g &#8728; f) = F(g) &#8728; F(f)</code>
+
+*      if <code>&eta;</code> is a natural transformation from `G` to `H`, then for every <code>f:C1&rarr;C2</code> in `G` and `H`'s source category <b>C</b>: <code>&eta;[C2] &#8728; G(f) = H(f) &#8728; &eta;[C1]</code>.
+
+*      <code>(&eta; F)[E] = &eta;[F(E)]</code> 
+
+*      <code>(K &eta;)[E} = K(&eta;[E])</code>
+
+*      <code>((&phi; -v- &eta;) F) = ((&phi; F) -v- (&eta; F))</code>
 
 Let's use the definitions of naturalness, and of composition of natural transformations, to establish two lemmas.
 
 
-Recall that join is a natural transformation from the (composite) functor MM to M. So for elements C1 in <b>C</b>, join[C1] will be a morphism from MM(C1) to M(C1). And for any morphism f:a&rarr;b in <b>C</b>:
+Recall that `join` is a natural transformation from the (composite) functor `MM` to `M`. So for elements `C1` in <b>C</b>, `join[C1]` will be a morphism from `MM(C1)` to `M(C1)`. And for any morphism <code>f:C1&rarr;C2</code> in <b>C</b>:
+
+<pre>
+       (1) join[C2] &#8728; MM(f)  =  M(f) &#8728; join[C1]
+</pre>
 
-       (1) join[b] &#8728; MM(f)  =  M(f) &#8728; join[a]
+Next, let <code>&gamma;</code> be a transformation from `G` to `MG'`, and
+ consider the composite transformation <code>((join MG') -v- (MM &gamma;))</code>.
 
-Next, consider the composite transformation ((join MG') -v- (MM &gamma;)).
-       &gamma; is a transformation from G to MG', and assigns elements C1 in <b>C</b> a morphism &gamma;*: G(C1) &rarr; MG'(C1). (MM &gamma;) is a transformation that instead assigns C1 the morphism MM(&gamma;*).
-       (join MG') is a transformation from MMMG' to MMG' that assigns C1 the morphism join[MG'(C1)].
-       Composing them:
+*      <code>&gamma;</code> assigns elements `C1` in <b>C</b> a morphism <code>&gamma;\*:G(C1) &rarr; MG'(C1)</code>. <code>(MM &gamma;)</code> is a transformation that instead assigns `C1` the morphism <code>MM(&gamma;\*)</code>.
+
+*      `(join MG')` is a transformation from `MM(MG')` to `M(MG')` that assigns `C1` the morphism `join[MG'(C1)]`.
+
+Composing them:
+
+<pre>
        (2) ((join MG') -v- (MM &gamma;)) assigns to C1 the morphism join[MG'(C1)] &#8728; MM(&gamma;*).
+</pre>
 
-Next, consider the composite transformation ((M &gamma;) -v- (join G)).
-       (3) This assigns to C1 the morphism M(&gamma;*) &#8728; join[G(C1)].
+Next, consider the composite transformation <code>((M &gamma;) -v- (join G))</code>:
 
-So for every element C1 of <b>C</b>:
+<pre>
+       (3) ((M &gamma;) -v- (join G)) assigns to C1 the morphism M(&gamma;*) &#8728; join[G(C1)].
+</pre>
+
+So for every element `C1` of <b>C</b>:
+
+<pre>
        ((join MG') -v- (MM &gamma;))[C1], by (2) is:
-       join[MG'(C1)] &#8728; MM(&gamma;*), which by (1), with f=&gamma;*: G(C1)&rarr;MG'(C1) is:
+       join[MG'(C1)] &#8728; MM(&gamma;*), which by (1), with f=&gamma;*:G(C1)&rarr;MG'(C1) is:
        M(&gamma;*) &#8728; join[G(C1)], which by 3 is:
        ((M &gamma;) -v- (join G))[C1]
+</pre>
 
-So our (lemma 1) is: ((join MG') -v- (MM &gamma;))  =  ((M &gamma;) -v- (join G)), where &gamma; is a transformation from G to MG'.
+So our **(lemma 1)** is:
+
+<pre>
+       ((join MG') -v- (MM &gamma;))  =  ((M &gamma;) -v- (join G)),
+       where as we said &gamma; is a natural transformation from G to MG'.
+</pre>
 
 
-Next recall that unit is a natural transformation from 1C to M. So for elements C1 in <b>C</b>, unit[C1] will be a morphism from C1 to M(C1). And for any morphism f:a&rarr;b in <b>C</b>:
-       (4) unit[b] &#8728; f = M(f) &#8728; unit[a]
+Next recall that `unit` is a natural transformation from `1C` to `M`. So for elements `C1` in <b>C</b>, `unit[C1]` will be a morphism from `C1` to `M(C1)`. And for any morphism <code>f:C1&rarr;C2</code> in <b>C</b>:
 
-Next consider the composite transformation ((M &gamma;) -v- (unit G)). (5) This assigns to C1 the morphism M(&gamma;*) &#8728; unit[G(C1)].
+<pre>
+       (4) unit[C2] &#8728; f = M(f) &#8728; unit[C1]
+</pre>
 
-Next consider the composite transformation ((unit MG') -v- &gamma;). (6) This assigns to C1 the morphism unit[MG'(C1)] &#8728; &gamma;*.
+Next, consider the composite transformation <code>((M &gamma;) -v- (unit G))</code>:
+
+<pre>
+       (5) ((M &gamma;) -v- (unit G)) assigns to C1 the morphism M(&gamma;*) &#8728; unit[G(C1)].
+</pre>
+
+Next, consider the composite transformation <code>((unit MG') -v- &gamma;)</code>:
+
+<pre>
+       (6) ((unit MG') -v- &gamma;) assigns to C1 the morphism unit[MG'(C1)] &#8728; &gamma;*.
+</pre>
 
 So for every element C1 of <b>C</b>:
+
+<pre>
        ((M &gamma;) -v- (unit G))[C1], by (5) =
-       M(&gamma;*) &#8728; unit[G(C1)], which by (4), with f=&gamma;*: G(C1)&rarr;MG'(C1) is:
+       M(&gamma;*) &#8728; unit[G(C1)], which by (4), with f=&gamma;*:G(C1)&rarr;MG'(C1) is:
        unit[MG'(C1)] &#8728; &gamma;*, which by (6) =
        ((unit MG') -v- &gamma;)[C1]
+</pre>
 
-So our lemma (2) is: (((M &gamma;) -v- (unit G))  =  ((unit MG') -v- &gamma;)), where &gamma; is a transformation from G to MG'.
+So our **(lemma 2)** is:
+
+<pre>
+       (((M &gamma;) -v- (unit G))  =  ((unit MG') -v- &gamma;)),
+       where as we said &gamma; is a natural transformation from G to MG'.
+</pre>
 
 
-Finally, we substitute ((join G') -v- (M &gamma;) -v- &phi;) for &gamma; <=< &phi; in the monad laws. For simplicity, I'll omit the "-v-".
+Finally, we substitute <code>((join G') -v- (M &gamma;) -v- &phi;)</code> for <code>&gamma; &lt;=&lt; &phi;</code> in the monad laws. For simplicity, I'll omit the "-v-".
 
-       for all &phi;,&gamma;,&rho; in T, where &phi; is a transformation from F to MF', &gamma; is a transformation from G to MG', R is a transformation from R to MR', and F'=G and G'=R:
+<pre>
+       For all &rho;, &gamma;, &phi; in T,
+       where &phi; is a transformation from F to MF',
+       &gamma; is a transformation from G to MG',
+       &rho; is a transformation from R to MR',
+       and F'=G and G'=R:
 
-       (i) &gamma; <=< &phi; etc are also in T
+            (i) &gamma; <=< &phi; etc are also in T
        ==>
-       (i') ((join G') (M &gamma;) &phi;) etc are also in T
+           (i') ((join G') (M &gamma;) &phi;) etc are also in T
 
 
-       (ii) (&rho; <=< &gamma;) <=< &phi;  =  &rho; <=< (&gamma; <=< &phi;)
+
+           (ii) (&rho; <=< &gamma;) <=< &phi;  =  &rho; <=< (&gamma; <=< &phi;)
        ==>
-                (&rho; <=< &gamma;) is a transformation from G to MR', so:
-                       (&rho; <=< &gamma;) <=< &phi; becomes: (join R') (M (&rho; <=< &gamma;)) &phi;
-                                                       which is: (join R') (M ((join R') (M &rho;) &gamma;)) &phi;
-                       substituting in (ii), and helping ourselves to associativity on the rhs, we get:
+                   (&rho; <=< &gamma;) is a transformation from G to MR', so
+                       (&rho; <=< &gamma;) <=< &phi; becomes: ((join R') (M (&rho; <=< &gamma;)) &phi;)
+                                                       which is: ((join R') (M ((join R') (M &rho;) &gamma;)) &phi;)
+
+                       similarly, &rho; <=< (&gamma; <=< &phi;) is:
+                                                       ((join R') (M &rho;) ((join G') (M &gamma;) &phi;))
 
-            ((join R') (M ((join R') (M &rho;) &gamma;)) &phi;) = ((join R') (M &rho;) (join G') (M &gamma;) &phi;)
-                     ---------------------
+                       substituting these into (ii), and helping ourselves to associativity on the rhs, we get:
+               ((join R') (M ((join R') (M &rho;) &gamma;)) &phi;) = ((join R') (M &rho;) (join G') (M &gamma;) &phi;)
+    
                        which by the distributivity of functors over composition, and helping ourselves to associativity on the lhs, yields:
-                    ------------------------
-            ((join R') (M join R') (MM &rho;) (M &gamma;) &phi;) = ((join R') (M &rho;) (join G') (M &gamma;) &phi;)
-                                                             ---------------
+               ((join R') (M join R') (MM &rho;) (M &gamma;) &phi;) = ((join R') (M &rho;) (join G') (M &gamma;) &phi;)
+  
                        which by lemma 1, with &rho; a transformation from G' to MR', yields:
-                                                             -----------------
-            ((join R') (M join R') (MM &rho;) (M &gamma;) &phi;) = ((join R') (join MR') (MM &rho;) (M &gamma;) &phi;)
+               ((join R') (M join R') (MM &rho;) (M &gamma;) &phi;) = ((join R') (join MR') (MM &rho;) (M &gamma;) &phi;)
 
-                       which will be true for all &rho;,&gamma;,&phi; just in case:
+                       which will be true for all &rho;,&gamma;,&phi; only when:
+               ((join R') (M join R')) = ((join R') (join MR')), for any R'.
 
-             ((join R') (M join R')) = ((join R') (join MR')), for any R'.
+                       which will in turn be true when:
+      (ii') (join (M join)) = (join (join M))
 
-                       which will in turn be true just in case:
-
-       (ii') (join (M join)) = (join (join M))
 
 
+        (iii.1) (unit G') <=< &gamma;  =  &gamma;
+                when &gamma; is a natural transformation from some FG' to MG'
        (iii.1) (unit F') <=< &phi;  =  &phi;
        ==>
                        (unit F') is a transformation from F' to MF', so:
@@ -352,6 +436,10 @@ Finally, we substitute ((join G') -v- (M &gamma;) -v- &phi;) for &gamma; <=< &ph
        (iii.1') (join (M unit) = the identity transformation
 
 
+
+
+        (iii.2)                     &gamma;  =  &gamma; <=< (unit G)
+                when &gamma; is a natural transformation from G to some MR'G
        (iii.2) &phi;  =  &phi; <=< (unit F)
        ==>
                        &phi; is a transformation from F to MF', so:
@@ -370,10 +458,12 @@ Finally, we substitute ((join G') -v- (M &gamma;) -v- &phi;) for &gamma; <=< &ph
                                which will in turn be true just in case:
 
        (iii.2') (join (unit M)) = the identity transformation
+</pre>
 
 
 Collecting the results, our monad laws turn out in this format to be:
 
+</pre>
        when &phi; a transformation from F to MF', &gamma; a transformation from F' to MG', &rho; a transformation from G' to MR' all in T:
 
        (i') ((join G') (M &gamma;) &phi;) etc also in T
@@ -383,11 +473,12 @@ Collecting the results, our monad laws turn out in this format to be:
        (iii.1') (join (M unit)) = the identity transformation
 
        (iii.2')(join (unit M)) = the identity transformation
+</pre>
 
 
 
-7. The functional programming presentation of the monad laws
-------------------------------------------------------------
+Getting to the functional programming presentation of the monad laws
+--------------------------------------------------------------------
 In functional programming, unit is usually called "return" and the monad laws are usually stated in terms of return and an operation called "bind" which is interdefinable with <=< or with join.
 
 Additionally, whereas in category-theory one works "monomorphically", in functional programming one usually works with "polymorphic" functions.