title: How can we interact with 2 MonadError constraints having 2 different error types?
body: <p>Say I have a function</p>
  
  <pre><code>function1 :: (MonadError String m, MonadIO m) =&gt; m Int
  
  function2 :: (MonadError Int m, MonadIO m) =&gt; m Int
  </code></pre>
  
  <p>and a function to transform <code>Int</code> into a <code>String</code></p>
  
  <pre><code>renderException :: Int -&gt; String
  </code></pre>
  
  <p>Is there a way to implement function3, which is reusing all 3 functions?</p>
  
  <pre><code>function3 :: (MonadError String m, MonadIO m) =&gt; m Int
  -- add the results from function1, function2 and 
  -- transform function2 error into a String
  </code></pre>