Yeah, ErrorT should do what you want (EitherT is probably essentially the same thing)<div><br></div><div>login would have the type:</div><div>login :: <span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">String -&gt; String -&gt; ErrorT </span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">DServError </span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">IO </span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">LoginResponse</span></div>
<div><br></div><div>and you would use it like this:</div><div>result &lt;- runErrorT $ <span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">authenticatedReq </span></div>
<div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "><br></span></div><div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">You can use runErrorT, or catch when you want to process a possible error.</span></div>
<div><br></div><div>result would have the type Either <span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">DServError whatever</span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">. This would leave out the </span><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">Result type, but if you really want to, you can add it with the appropriate lifting.</span></div>
<div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "><br></span></div><div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">Hope that helps,</span></div>
<div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "><br></span></div><div><span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; ">- Job</span></div>
<div><br><br><div class="gmail_quote">2010/7/25 Eugeny N Dzhurinsky <span dir="ltr">&lt;<a href="mailto:bofh@redwerk.com">bofh@redwerk.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
Hello, everybody!<br>
<br>
I am trying to develop some sort of library, which supposed to sign into a WEB<br>
service, then perform some requests with it.<br>
<br>
Initially I designed methods in the following way<br>
<br>
data DServError = InvalidCredentials | InvalidRequest | ...<br>
<br>
newtype Result a = Result { getOpResult :: Either DServError a }<br>
<br>
data DSession = Session { ... }<br>
<br>
data DLoginResponse = LoginResponse { currentSession :: DSession, ... }<br>
<br>
login :: String -&gt; String -&gt; IO ( Result LoginResponse )<br>
<br>
servRequest1 :: DSession -&gt; ParamType1 -&gt; ParamType2 -&gt; ... -&gt; IO ( Result DServResponse )<br>
<br>
<br>
Now I want to be able of doing something like<br>
<br>
authenticatedReq = do<br>
    loginResponse &lt;- login &quot;username&quot; &quot;password&quot;<br>
    let session = currentSession loginResponse<br>
    servRequest1 session ... ... ...<br>
    servRequest2 session ... ... ...<br>
    ...<br>
<br>
so if login succeeds - I will be able to extract Right data from the Either response ( with<br>
explicit or implicit usage of getOpResult), if any of operations within &quot;do&quot;<br>
block will fail with DServError - then an error should be reported.<br>
<br>
I think the solution for this may be using Control.Exception and it&#39;s<br>
try/catch? Or may be there&#39;s some trick available for Either?<br>
<br>
I looked at EitherT, and it seems that I have to wrap every invocation into<br>
EitherT and then chain them with &gt;&gt;/&gt;&gt;=<br>
<font color="#888888"><br>
--<br>
Eugene Dzhurinsky<br>
</font><br>_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
<br></blockquote></div><br></div>