title: Intuition behind calling Zero for else branch of if..then construct in computation expressions
body: <p>The <a href="http://msdn.microsoft.com/en-us/library/dd233182.aspx">msdn documentation</a> for the <code>Zero</code> method in computation expressions states that</p>
  
  <blockquote>
    <p>Called for empty <code>else</code> branches of <code>if...then</code> expressions in computation expressions.</p>
  </blockquote>
  
  <p>Assume we're using an <code>identity</code> computation builder which does not have <code>Zero</code> defined. </p>
  
  <pre><code>let IdentityBuilder() = 
      member this.Bind(i, f) = f i
      member this.Return(i) = i
  
  let identity = new IdentityBuilder()
  </code></pre>
  
  <p>The code below is allowed</p>
  
  <pre><code>identity {
      printf "Hello World"
      return 1
  }
  </code></pre>
  
  <p>However, the following code is not allowed and fails with the compiler error </p>
  
  <blockquote>
    <p>This control construct may only be used if the computation expression builder defines a 'Zero' method</p>
  </blockquote>
  
  <pre><code>identity {
      if true then printf "Hello World"
      return 1
  }
  </code></pre>
  
  <p>Why does the compiler insist on calling <code>Zero</code> for <code>else</code> branches? What is the intuition behind this?</p>