<html>
<head>
<meta http-equiv="Content-Type" content="text/html"/>
</head>
<body>
<div style="color: black;">
<p style="margin: 0 0 1em 0; color: black;">The conflation of assignment
and awaiting is a bad idea. It leads to lots of unnecessary temporary
variables and makes anything but the simplest expression involving more
than one await/promise very ugly - akin to the original syntax you're
trying to avoid with inner variable declarations and <- operations. </p>
<p style="margin: 0 0 1em 0; color: black;">A very similar syntax was used
by nodent until v1 when it was replaced with async and await.</p>
<p style="margin: 0 0 1em 0; color: black;">I'd be much more interested in
a VM extension that performed auto boxing/unboxing on Promises, achieving a
similar result without the need for additional syntactic constructions<br></p>
<p style="margin: 0 0 1em 0; color: black;">> ----------<br>
> monadic extension to do-notation<br>
> From: Raphael Mu <encryptedredux@gmail.com><br>
> Date: 7 Feb, 17:07<br>
> To: es-discuss@mozilla.org<br>
><br>
> The ES Promise is an instance of Monad, a property that implies a much
more<br>
> concise and expressive syntax for using Promise, by exploiting its
monadic<br>
> properties. I've seen a lot of people complain about Promises having
too<br>
> clumsy a syntax, and likewise for async/await.<br>
><br>
> We now have the do-notation proposal (<br>
> <a
href="http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions)">http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions)</a>,
and<br>
> monadic assignment would fit well into the syntax.<br>
><br>
> The extension would allow use of `<-` within a do-expression for
binding<br>
> Promise values to variables, and the computation would behave most<br>
> similarly to the Either monad in Haskell (in the following code, if<br>
> promiseA or promiseB reject, the result of the entire expression would
be a<br>
> rejected Promise).<br>
><br>
> (monadic extension)<br>
> ```javascript<br>
> let finalPromise = do {<br>
>     let a <- promiseA;<br>
>     let b <- promiseB;<br>
>     let c = f(a, b);<br>
>     g(a, b, c)<br>
> }<br>
> ```<br>
><br>
> (desugared to async/await)<br>
> ```javascript<br>
> let finalPromise = (async () => {<br>
>     let a = await promiseA;<br>
>     let b = await promiseB;<br>
>     let c = f(a, b);<br>
>     return g(a, b, c);<br>
> })();<br>
> ```<br>
><br>
> (desugared to ES6)<br>
> ```javascript<br>
> let finalPromise = promiseA.then(a =><br>
>     promiseB.then(b => {<br>
>         let c = f(a, b);<br>
>         return g(a, b, c);<br>
>     })<br>
> );<br>
> ```<br>
><br>
> The do-notation would apply Promise.resolve to the last expression
(like<br>
> async and Promise#then), effectively returning another Promise. The
current<br>
> proposal doesn't specify this behavior, but there are two ways about
this<br>
> collision:<br>
><br>
> 1. use an explicit version of do-notation, e.g. `async do { ... }` or
`do*<br>
> { ... }`<br>
> 2. revise the do-notation proposal to always apply Promise.resolve to
the<br>
> last expression<br>
><br>
> Both choices give us a new Promise literal for free: `do* { x }` (1)
or `do<br>
> { x }` (2) would be functionally equivalent to `Promise.resolve(x)`.<br>
><br>
> The idea was briefly mentioned several years ago, but didn't attract
much<br>
> attention (<br>
> <a
href="https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html)">https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html)</a>.<br>
><br>
> This is an earlier draft of this proposal:<br>
> <a
href="https://github.com/edge/es-monadic">https://github.com/edge/es-monadic</a><br>
><br>
><br>
><br>
> ----------<br>
> Re: monadic extension to do-notation<br>
> From: Rick Waldron <waldron.rick@gmail.com><br>
> Date: 7 Feb, 17:19<br>
> To: Raphael Mu <encryptedredux@gmail.com>,
es-discuss@mozilla.org<br>
><br>
> 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>
> On Sun, Feb 7, 2016 at 12:07 PM Raphael Mu
<encryptedredux@gmail.com> wrote:<br>
><br>
>> The ES Promise is an instance of Monad, a property that implies a
much<br>
>> more concise and expressive syntax for using Promise, by
exploiting its<br>
>> monadic properties. I've seen a lot of people complain about
Promises<br>
>> having too clumsy a syntax, and likewise for async/await.<br>
>><br>
>> We now have the do-notation proposal (<br>
>> <a
href="http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions)">http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions)</a>,
and<br>
>> monadic assignment would fit well into the syntax.<br>
>><br>
>> The extension would allow use of `<-` within a do-expression
for binding<br>
>> Promise values to variables, and the computation would behave most<br>
>> similarly to the Either monad in Haskell (in the following code,
if<br>
>> promiseA or promiseB reject, the result of the entire expression
would be a<br>
>> rejected Promise).<br>
>><br>
>> (monadic extension)<br>
>> ```javascript<br>
>> let finalPromise = do {<br>
>>     let a <- promiseA;<br>
>>     let b <- promiseB;<br>
>>     let c = f(a, b);<br>
>>     g(a, b, c)<br>
>> }<br>
>> ```<br>
>><br>
>> (desugared to async/await)<br>
>> ```javascript<br>
>> let finalPromise = (async () => {<br>
>>     let a = await promiseA;<br>
>>     let b = await promiseB;<br>
>>     let c = f(a, b);<br>
>>     return g(a, b, c);<br>
>> })();<br>
>> ```<br>
>><br>
>> (desugared to ES6)<br>
>> ```javascript<br>
>> let finalPromise = promiseA.then(a =><br>
>>     promiseB.then(b => {<br>
>>         let c = f(a, b);<br>
>>         return g(a, b, c);<br>
>>     })<br>
>> );<br>
>> ```<br>
>><br>
>> The do-notation would apply Promise.resolve to the last expression
(like<br>
>> async and Promise#then), effectively returning another Promise.
The current<br>
>> proposal doesn't specify this behavior, but there are two ways
about this<br>
>> collision:<br>
>><br>
>> 1. use an explicit version of do-notation, e.g. `async do { ... }`
or `do*<br>
>> { ... }`<br>
>> 2. revise the do-notation proposal to always apply Promise.resolve
to the<br>
>> last expression<br>
>><br>
>> Both choices give us a new Promise literal for free: `do* { x }`
(1) or<br>
>> `do { x }` (2) would be functionally equivalent to
`Promise.resolve(x)`.<br>
>><br>
>> The idea was briefly mentioned several years ago, but didn't
attract much<br>
>> attention (<br>
>> <a
href="https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html)">https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html)</a>.<br>
>><br>
>> This is an earlier draft of this proposal:<br>
>> <a
href="https://github.com/edge/es-monadic">https://github.com/edge/es-monadic</a><br>
>> _______________________________________________<br>
>> es-discuss mailing list<br>
>> es-discuss@mozilla.org<br>
>> <a
href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br>
>><br>
><br>
><br>
><br>
> ----------<br>
> Re: monadic extension to do-notation<br>
> From: Kevin Smith <zenparsing@gmail.com><br>
> Date: 7 Feb, 17:35<br>
> To: Rick Waldron <waldron.rick@gmail.com>, Raphael Mu
<encryptedredux@gmail.com>, es-discuss@mozilla.org<br>
><br>
> Why not just use await within `async do`?<br>
><br>
> On 12:19PM, Sun, Feb 7, 2016 Rick Waldron
<waldron.rick@gmail.com> wrote:<br>
><br>
>> 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>
>> On Sun, Feb 7, 2016 at 12:07 PM Raphael Mu
<encryptedredux@gmail.com><br>
>> wrote:<br>
>><br>
>>> The ES Promise is an instance of Monad, a property that
implies a much<br>
>>> more concise and expressive syntax for using Promise, by
exploiting its<br>
>>> monadic properties. I've seen a lot of people complain about
Promises<br>
>>> having too clumsy a syntax, and likewise for async/await.<br>
>>><br>
>>> We now have the do-notation proposal (<br>
>>> <a
href="http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions)">http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions)</a>,
and<br>
>>> monadic assignment would fit well into the syntax.<br>
>>><br>
>>> The extension would allow use of `<-` within a
do-expression for binding<br>
>>> Promise values to variables, and the computation would behave
most<br>
>>> similarly to the Either monad in Haskell (in the following
code, if<br>
>>> promiseA or promiseB reject, the result of the entire
expression would be a<br>
>>> rejected Promise).<br>
>>><br>
>>> (monadic extension)<br>
>>> ```javascript<br>
>>> let finalPromise = do {<br>
>>>     let a <- promiseA;<br>
>>>     let b <- promiseB;<br>
>>>     let c = f(a, b);<br>
>>>     g(a, b, c)<br>
>>> }<br>
>>> ```<br>
>>><br>
>>> (desugared to async/await)<br>
>>> ```javascript<br>
>>> let finalPromise = (async () => {<br>
>>>     let a = await promiseA;<br>
>>>     let b = await promiseB;<br>
>>>     let c = f(a, b);<br>
>>>     return g(a, b, c);<br>
>>> })();<br>
>>> ```<br>
>>><br>
>>> (desugared to ES6)<br>
>>> ```javascript<br>
>>> let finalPromise = promiseA.then(a =><br>
>>>     promiseB.then(b => {<br>
>>>         let c = f(a,
b);<br>
>>>         return g(a, b,
c);<br>
>>>     })<br>
>>> );<br>
>>> ```<br>
>>><br>
>>> The do-notation would apply Promise.resolve to the last
expression (like<br>
>>> async and Promise#then), effectively returning another
Promise. The current<br>
>>> proposal doesn't specify this behavior, but there are two ways
about this<br>
>>> collision:<br>
>>><br>
>>> 1. use an explicit version of do-notation, e.g. `async do {
... }` or<br>
>>> `do* { ... }`<br>
>>> 2. revise the do-notation proposal to always apply
Promise.resolve to the<br>
>>> last expression<br>
>>><br>
>>> Both choices give us a new Promise literal for free: `do* { x
}` (1) or<br>
>>> `do { x }` (2) would be functionally equivalent to
`Promise.resolve(x)`.<br>
>>><br>
>>> The idea was briefly mentioned several years ago, but didn't
attract much<br>
>>> attention (<br>
>>> <a
href="https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html)">https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html)</a>.<br>
>>><br>
>>> This is an earlier draft of this proposal:<br>
>>> <a
href="https://github.com/edge/es-monadic">https://github.com/edge/es-monadic</a><br>
>>> _______________________________________________<br>
>>> es-discuss mailing list<br>
>>> es-discuss@mozilla.org<br>
>>> <a
href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br>
>>><br>
>> _______________________________________________<br>
>> es-discuss mailing list<br>
>> es-discuss@mozilla.org<br>
>> <a
href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br>
>><br>
><br>
><br>
><br>
> ----------<br>
> _______________________________________________<br>
> es-discuss mailing list<br>
> es-discuss@mozilla.org<br>
> <a
href="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><br>
><br>
</p>
</div>
</body>
</html>