The usual implementation of the Either&#x2F;Option monads already does this though:<p><pre><code>    instance Monad Maybe where  
        return x = Just x  
        Nothing &gt;&gt;= f = Nothing  
        Just x &gt;&gt;= f  = f x  
        fail _ = Nothing  
</code></pre>
and<p><pre><code>  instance (Error e) =&gt; Monad (Either e) where  
      return x = Right x   
      Right x &gt;&gt;= f = f x  
      Left err &gt;&gt;= f = Left err  
      fail msg = Left (strMsg msg) 
</code></pre>
The end result is still a value of that type. You get the short-circuting behavior as soon as you hit Nothing&#x2F;Left.