<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Nov 14, 2015 at 9:24 AM, Theodore Lief Gannon <span dir="ltr"><<a href="mailto:tanuki@gmail.com" target="_blank">tanuki@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">You're missing IO in the type declaration, which I believe means that do block is running in the Id monad -- by inference, Id ByteString.</blockquote></div><br></div><div class="gmail_extra">There's no running in the Id monad. The compiler doesn't understand monads the way we'd like it to. It's all very syntactic, namely:<br><br></div><div class="gmail_extra">1. the compiler desugars the do block into an expression<br></div><div class="gmail_extra">2. it typechecks the expression: no special understanding of the monad typeclass involved<br></div><div class="gmail_extra">3. and if there are errors, it reports them<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">What we're seeing is special handling for stage 3: reporting errors in a do-block. Sometimes it helps, sometimes it hinders. For instance, the derivation of this signature is confusing indeed:<br><br><span style="font-family:monospace,monospace">   IO System.IO.Handle<br>-> (System.IO.Handle -> IO Data.ByteString.ByteString)<br>-> Data.ByteString.ByteString<br></span><br></div><div class="gmail_extra"><br><br clear="all"></div><div class="gmail_extra"><div><div class="gmail_signature">-- Kim-Ee</div></div>
</div></div>