<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, May 23, 2013 at 6:57 PM, Tab Atkins Jr. <span dir="ltr"><<a href="mailto:jackalmage@gmail.com" target="_blank">jackalmage@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div class="im">On Wed, May 22, 2013 at 10:19 PM, Domenic Denicola<br>

<<a href="mailto:domenic@domenicdenicola.com">domenic@domenicdenicola.com</a>> wrote:<br>
> It also adds a fulfill method. Thus, it presents two interfaces to the user: fulfill + chain (aka unit + bind), and Q + then (aka resolve + then). This seems to squarely fall into the trap Mark described in his original post, viz.<br>

><br>
>> The main failure mode of standards bodies is to resolve a conflict by adding the union of the advocated features.<br>
<br>
</div>Certainly a common failure mode, but it's not *always* a failure mode.<br>
 Sometimes, there really are two distinct use-cases for something, and<br>
you need two solutions for it.  Obviously, I believe this falls into<br>
that bucket, but others may disagree.  ^_^<br>
<br>
In this case, it's easy to demonstrate that you *can* fulfill either<br>
use-case starting from the other one.  .chain() lets .then() be<br>
created in user-space in a way such that both styles of interaction<br>
work together.  .then() lets .chain() be created in user-space by<br>
splitting things into "thenable promises" and "chainable promises",<br>
which can't interoperate without ugliness.<br>
<br>
I was gracious and<br>
<div class="im"><br>
> And indeed, I think the subsequent sentences ring just as true:<br>
><br>
>> Here, this works even worse than it usually does. The coherence of lifting depends on the absence of autolifting, and vice versa. We need to make a choice.<br>
<br>
</div>This one doesn't even make *sense* to me.  "Autolifting" (aka<br>
conditional lifting, aka Future#resolve) is very useful for monads.<br>
I'm not sure where Mark gets the idea that lifting is incoherent if<br>
autolifting exists.  I'd appreciate being corrected if I'm wrong.<br></blockquote><div><br></div><div style>I went into more depth on this matter in a presentation I just did at TC39. The slide deck is at <<a href="http://wiki.ecmascript.org/lib/exe/fetch.php?id=strawman%3Aconcurrency&media=strawman:promisesvsmonads2.pdf">http://wiki.ecmascript.org/lib/exe/fetch.php?id=strawman%3Aconcurrency&media=strawman:promisesvsmonads2.pdf</a>>. It was written to accompany a verbal explanation, which it did, but not to be self-explanatory. I will try to find the time to explain it, but not today. <span style="font-family:arial,sans-serif;font-size:13.333333969116211px">I'll be posting more on this soon. Nevertheless, I think y'all will get something out of the slideshow prior to this explanation.</span></div>
<div><br></div><div style><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">TC39 did not yet come to an official consensus. That said, the emerging winner in the room was clearly AP3 from slide19 of the slide deck, which Alex has revised Promise.idl to follow. It was clear from the positions in the room that we needed both lifting and autolifting in order to achieve consensus. </span><span style="font-family:arial,sans-serif;font-size:13.333333969116211px">In the room I was agreeable to AP3 as well. I remain so.</span><div style="font-family:arial,sans-serif;font-size:13.333333969116211px">
<br></div><div style="font-family:arial,sans-serif;font-size:13.333333969116211px">AP3 only does recursive unwrapping on the return side of .then. AP2, based on your post from yesterday, does recursive unwrapping on both sides. I stated that I prefer the AP2 style recursive unwrapping on both sides, but the advocates for use of .fulfill (unconditional lifting) strongly favored AP3. I will let them speak for themselves.</div>
<div style="font-family:arial,sans-serif;font-size:13.333333969116211px"><br></div><div style="font-family:arial,sans-serif;font-size:13.333333969116211px">Even after sleeping on it, I can live happily with AP3. It is actually even better at supporting QP style than I appreciated yesterday. In fact, for good QP style code, it is equivalent to AP2. I am satisfied that either in AP2 or AP3, autolifting is coherent in the presence of lifting since the presence of lifting will be invisible to good QP style code. </div>
<div style="font-family:arial,sans-serif;font-size:13.333333969116211px"><br></div><div style="font-family:arial,sans-serif;font-size:13.333333969116211px">As for whether lifting is coherent in the presence of autolifting in AP3, I will let the lifting advocates speak for themselves. </div>
<div style="font-family:arial,sans-serif;font-size:13.333333969116211px"><br></div><div style="font-family:arial,sans-serif;font-size:13.333333969116211px">We may not have made the best choice, but we didn't make sausage.</div>
</div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<br>
(If autolifting is your only operation, then adding lifting is<br>
incoherent, I agree, because you've already established that it's<br>
impossible to have nested containers.  But the reverse does not hold<br>
true.)<br>
<div class="im"><br>
> The point of my post was to demonstrate that fulfill/chain aka unit/bind could be built in user space *extremely simply*, thus allowing "the nascent monadic efforts in JS" to go off and do their own thing for a few years before asking to be baked into the platform. Promises, in the Q-plus-then-sense, have paid their dues. It's not very sporting for the monadic efforts to hijack the promise-standardization train, without first doing similar due diligence via real-world implementations and experience.<br>

<br>
</div>As David points out, trying to paint monads as something new and<br>
unproven is pretty obviously silly.  They've been proving themselves<br>
for 20+ years.<br>
<span class=""><font color="#888888"><br>
~TJ<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>    Cheers,<br>    --MarkM
</div></div>