Monad laws expressed in terms of join instead of bind? : <p>The monad laws are traditionally described in terms of <code>&gt;&gt;=</code> and <code>pure</code>:</p>

<pre><code>pure a &gt;&gt;= k = k a
m &gt;&gt;= pure = m
m &gt;&gt;= (\x -&gt; k x &gt;&gt;= h) = (m &gt;&gt;= k) &gt;&gt;= h
</code></pre>

<p>However, monads can also be defined in terms of <code>join</code> instead of <code>&gt;&gt;=</code>. I would like to come up with a formulation of the monad laws in terms of <code>join</code>.</p>

<p>Using <code>x &gt;&gt;= f = join (fmap f x)</code>, it’s easy to rewrite the existing monad laws to eliminate <code>&gt;&gt;=</code>. Simplifying the results slightly with the help of the applicative laws, the first two laws are quite pleasantly expressed:</p>

<pre><code>join . pure = id
join . fmap pure = id
</code></pre>

<p>The intuition for these laws is easy, too, since clearly, introducing an extra “layer” with <code>pure</code> should be a no-op when combined with <code>join</code>. The third law, however, is not nearly so nice. It ends up looking like this:</p>

<pre><code>  join (fmap (\x -&gt; join (fmap h (k x))) m)
= join (fmap h (join (fmap k m)))
</code></pre>

<p>This does not pleasantly reduce using the applicative laws, and it’s much harder to understand without staring at it for a while. It certainly doesn’t have the same easy intuition.</p>

<p>Is there an equivalent, alternative formulation of the monad laws in terms of <code>join</code> that is easier to understand? Alternatively, is there any way to simplify the above law, or to make it easier to grok? The version with <code>&gt;&gt;=</code> is already less nice than the one expressed with Kleisli composition, but the version with <code>join</code> is nearly unreadable.</p>
