Are monad laws enforced in Haskell?
<p>From the Haskell wiki:</p>

<blockquote>
  <p>Monads can be viewed as a standard programming interface to various
  data or control structures, which is captured by the Monad class. All
  common monads are members of it:</p>

<pre><code>class Monad m where
  (&gt;&gt;=) :: m a -&gt; (a -&gt; m b) -&gt; m b
  (&gt;&gt;) :: m a -&gt; m b -&gt; m b
  return :: a -&gt; m a
  fail :: String -&gt; m a
</code></pre>
  
  <p>In addition to implementing the class functions, all instances of
  Monad should obey the following equations, or Monad Laws:</p>

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

<p><strong>Question:</strong> Are the three monad laws at the bottom actually enforced in any way by the language? Or are they extra axioms that <strong>you</strong> must enforce in order for your language construct of a "Monad" to match the mathematical concept of a "Monad"?</p>