title: ErrorT is deprecated, but ExceptT doesn't fit
body: <p>I had a monadic computation.  At some point it started requiring a MonadFail constraint because of a monadic pattern-match.</p>
  
  <p>My easy fix was to run it with this:</p>
  
  <pre><code>fmap (either error id) . runErrorT
  </code></pre>
  
  <p>Yet ouch:</p>
  
  <pre><code>Deprecated: "Use Control.Monad.Trans.Except instead"
  </code></pre>
  
  <p>So it appears that <code>ErrorT</code> is deprecated, and I'm to use <code>ExceptT</code> instead.  That sounds fine from the outside, but it doesn't appear like ExceptT is a drop-in replacement <em>at all!</em>  Just look at the instance declarations:</p>
  
  <pre><code>instance (Monad m, Error e) =&gt; MonadFail (ErrorT e m)
  instance MonadFail m =&gt; MonadFail (ExceptT e m)
  </code></pre>
  
  <p><code>ErrorT</code> <em>provides</em> a MonadFail implementation.  <code>ExceptT</code> merely <em>lifts</em> it.</p>
  
  <p>I'm not quite sure where to go from this point.</p>
  
  <ul>
  <li><p>my code eventually won't have the refutable bind at all.  It's one of those cases where it's statically known to work, yet not proven to the type checker yet.  I'll get there, but it'll take a while.  (Like, I'm going to need dependent types, so I'm going to need to learn dependent types.  It'll take a while.)</p></li>
  <li><p>yet in the meantime, my code needs to bind, and really I'm fine with <code>error</code> being called if I mess up.</p></li>
  </ul>
  
  <p>It seems what I'm looking for is some generic <code>MonadFail</code> implementation that allows me to… well, do what I want with a pattern failing to match.  <code>ErrorT</code> did this, and <code>ExceptT</code> doesn't.</p>
  
  <p>What are my non-deprecated options?</p>