<div dir="ltr">&gt; <span style="font-family:arial,sans-serif;font-size:13px">My preference is to call the new transformer ExceptT, with a basic</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">monad called Except, in line with most of the other transformers, and</span><br style="font-family:arial,sans-serif;font-size:13px">
<span style="font-family:arial,sans-serif;font-size:13px">to deprecate ErrorT.  (The rationale for the name is that Either isn&#39;t</span><br style="font-family:arial,sans-serif;font-size:13px"><span style="font-family:arial,sans-serif;font-size:13px">just for exceptions, and exceptions aren&#39;t just for errors.)</span><div>
<br></div><div><span style="font-family:arial,sans-serif">Specializing to an identity base monad is usually a misfeature in real code and only useful for pedagogical purposes.  Experts leave it polymorphic like this:</span></div>
<div><span style="font-family:arial,sans-serif"><br></span></div><div><font face="arial, sans-serif">expertCode :: (Monad m) =&gt; EitherT E m R</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">By designing the API entirely around the identity specialization you&#39;re optimizing for a narrow skill range of intermediate Haskell programmers who are:</font></div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">a) Smart enough to figure out that `ExceptT` is the official generalization of `EitherT`</font></div><div><font face="arial, sans-serif"><br>
</font></div><div><font face="arial, sans-serif">b) Not smart enough to figure out how to keep the base monad polymorphic</font></div><div><font face="arial, sans-serif"><br></font></div><div><div><font face="arial, sans-serif">So I propose that you leave the monad transformer name as `EitherT`, but use `Except` for the `Identity` specialization:</font></div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">type Except e r = EitherT e Identity r</font></div></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">This has the nice properties that:</font></div>
<div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">* The identity specialization doesn&#39;t conflict with `Either`</font></div><div><font face="arial, sans-serif"><br></font></div><div>
<font face="arial, sans-serif">* Beginners find `transformers` when they search for `EitherT` as they inevitably will</font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">* Existing packages that use `EitherT` won&#39;t break, thus preserving compatibility with the code bases that Edwards already mentioned</font></div>
<div><br></div></div>