<div dir="ltr">How is Promise an instance of Monad, if you can't ever have a Promise of a Promise?</div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Feb 7, 2016 at 9:59 AM, Raphael Mu <span dir="ltr"><<a href="mailto:encryptedredux@gmail.com" target="_blank">encryptedredux@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">The `a < -b` issue could be solved by using a different operator, like `</` or `<#`.</div><div class="HOEnZb"><div class="h5"><br><div class="gmail_quote"><div dir="ltr">On Sun, Feb 7, 2016 at 12:35 PM Kevin Smith <<a href="mailto:zenparsing@gmail.com" target="_blank">zenparsing@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p dir="ltr">Why not just use await within `async do`?</p>
<br><div class="gmail_quote"><div dir="ltr">On 12:19PM, Sun, Feb 7, 2016 Rick Waldron <<a href="mailto:waldron.rick@gmail.com" target="_blank">waldron.rick@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What does this do?<br><br><br>let finalPromise = do {<br>    let a;<br>    a <- b;<br>}<br><br><br>Currently, that's an expression that means "a less than negated b"<br><br>Rick<br><br><div class="gmail_quote"><div dir="ltr">On Sun, Feb 7, 2016 at 12:07 PM Raphael Mu <<a href="mailto:encryptedredux@gmail.com" target="_blank">encryptedredux@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>The ES Promise is an instance of Monad, a property that implies a much more concise and expressive syntax for using Promise, by exploiting its monadic properties. I've seen a lot of people complain about Promises having too clumsy a syntax, and likewise for async/await.<br></div><div><br></div><div>We now have the do-notation proposal (<a href="http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions" target="_blank">http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions</a>), and monadic assignment would fit well into the syntax.</div><div><br></div><div>The extension would allow use of `<-` within a do-expression for binding Promise values to variables, and the computation would behave most similarly to the Either monad in Haskell (in the following code, if promiseA or promiseB reject, the result of the entire expression would be a rejected Promise).</div><div><br></div><div>(monadic extension)<br></div><div>```javascript</div><div><div>let finalPromise = do {</div><div>    let a <- promiseA;</div><div>    let b <- promiseB;</div><div>    let c = f(a, b);</div><div>    g(a, b, c)</div><div>}</div></div><div>```</div><div><br></div><div>(desugared to async/await)</div><div>```javascript</div><div><div>let finalPromise = (async () => {</div><div>    let a = await promiseA;</div><div>    let b = await promiseB;</div><div>    let c = f(a, b);</div><div>    return g(a, b, c);</div><div>})();</div></div><div>```</div><div><br></div><div>(desugared to ES6)</div><div>```javascript</div><div><div>let finalPromise = promiseA.then(a =></div><div>    promiseB.then(b => {</div><div>        let c = f(a, b);</div><div>        return g(a, b, c);</div><div>    })</div><div>);</div></div><div>```</div><div><br></div><div>The do-notation would apply Promise.resolve to the last expression (like async and Promise#then), effectively returning another Promise. The current proposal doesn't specify this behavior, but there are two ways about this collision:</div><div><br></div><div>1. use an explicit version of do-notation, e.g. `async do { ... }` or `do* { ... }`</div><div>2. revise the do-notation proposal to always apply Promise.resolve to the last expression</div><div><br></div><div>Both choices give us a new Promise literal for free: `do* { x }` (1) or `do { x }` (2) would be functionally equivalent to `Promise.resolve(x)`.</div><div><br></div>The idea was briefly mentioned several years ago, but didn't attract much attention (<a href="https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html" target="_blank">https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html</a>).<div><br><div>This is an earlier draft of this proposal: <a href="https://github.com/edge/es-monadic" target="_blank">https://github.com/edge/es-monadic</a></div></div></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div>
</blockquote></div>
</div></div><br>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" rel="noreferrer" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
<br></blockquote></div><br></div>