title: Why are Clojure's `let` and `for` both monads?
body: <p><a href="https://groups.google.com/forum/#!msg/clojure/DJGHPQc5qaI/Sn7qtA5Uz04J">In this discussion</a> <a href="https://twitter.com/marick">Brian Marick</a> makes the point that <a href="http://clojuredocs.org/clojure_core/clojure.core/let"><code>let</code></a> and <a href="http://clojuredocs.org/clojure_core/clojure.core/for"><code>for</code></a> are monads in Clojure:</p>
  
  <blockquote>
    <p>That said, the <em>really</em> general-purpose monads tend to get written into the language as special forms. Clojure's <code>let</code> and <code>for</code> are both monads, but you don't need to know that to use them. </p>
  </blockquote>
  
  <p>This is <code>let</code></p>
  
  <pre><code>user=&gt; (let [c (+ 1 2)
           [d e] [5 6]]
       (-&gt; (+ d e) (- c)))
  8
  </code></pre>
  
  <p>This is <code>for</code></p>
  
  <pre><code>user=&gt; (for [x [0 1 2 3 4 5]
               :let [y (* x 3)]
               :when (even? y)]
           y)
  (0 6 12)
  </code></pre>
  
  <p>My question is: <strong>Why are Clojure's <code>let</code> and <code>for</code> both monads?</strong></p>