title: What's so special about 'return' keyword
body: <p>When I seemed to understand what return is for in Haskell, I tried to play with different alternatives and it seems that return not only can be used anywhere in the monad chain, but also can be excluded completely </p>
  
  <pre><code>*Main&gt; Just 9 &gt;&gt;= \y -&gt; (Just y) &gt;&gt;= \x -&gt; return x
  Just 9
  
  *Main&gt; Just 9 &gt;&gt;= \y -&gt; (return y) &gt;&gt;= \x -&gt; (Just y)
  Just 9
  
  *Main&gt; Just 9 &gt;&gt;= \y -&gt; (Just y) &gt;&gt;= \x -&gt; (Just x)
  Just 9 
  </code></pre>
  
  <p>Even if I omit return in my own instancing, I only get warning...</p>
  
  <pre><code>data MaybeG a = NothingG | JustG a deriving Show 
  instance Monad MaybeG where  
      --    return x = JustG x  
          NothingG &gt;&gt;= f = NothingG  
          JustG x &gt;&gt;= f  = f x  
          fail _ = NothingG  
  
  Monad.hs:3:10:
      Warning: No explicit method nor default method for `return'
      In the instance declaration for `Monad MaybeG'
  </code></pre>
  
  <p>and I still can use the monad</p>
  
  <pre><code>*Main&gt; JustG 9 &gt;&gt;= \y -&gt; (JustG 11) &gt;&gt;= \x -&gt; (JustG y)
  JustG 9
  
  *Main&gt; JustG 9 &gt;&gt;= \y -&gt; (NothingG) &gt;&gt;= \x -&gt; (JustG y)
  NothingG
  </code></pre>
  
  <p>So what's so special about the return keyword? Is this about more complex cases where I can not omit it? Or because this is the "right" way to do things even if they can be done differently?</p>
  
  <p><strong>UPDATE:</strong> 
  .. or another alternative, I could define my own monadic value constructor </p>
  
  <pre><code>finallyMyLastStepG :: Int -&gt; MaybeG Int
  finallyMyLastStepG a = JustG a  
  </code></pre>
  
  <p>and produce another variant of the same chain (with the same result)</p>
  
  <pre><code>*Main&gt; JustG 9 &gt;&gt;= \y -&gt; (JustG 11) &gt;&gt;= \x -&gt; (finallyMyLastStepG y)
  JustG 9
  </code></pre>