monadic extension to do-notation

Rick Waldron waldron.rick at gmail.com
Sun Feb 7 17:19:43 UTC 2016


What does this do?


let finalPromise = do {
let a;
a <- b;
}


Currently, that's an expression that means "a less than negated b"

Rick

On Sun, Feb 7, 2016 at 12:07 PM Raphael Mu <encryptedredux at gmail.com> wrote:

> 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.
>
> We now have the do-notation proposal (
> http://wiki.ecmascript.org/doku.php?id=strawman:do_expressions), and
> monadic assignment would fit well into the syntax.
>
> 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).
>
> (monadic extension)
> ```javascript
> let finalPromise = do {
>     let a <- promiseA;
>     let b <- promiseB;
>     let c = f(a, b);
>     g(a, b, c)
> }
> ```
>
> (desugared to async/await)
> ```javascript
> let finalPromise = (async () => {
>     let a = await promiseA;
>     let b = await promiseB;
>     let c = f(a, b);
>     return g(a, b, c);
> })();
> ```
>
> (desugared to ES6)
> ```javascript
> let finalPromise = promiseA.then(a =>
>     promiseB.then(b => {
>         let c = f(a, b);
>         return g(a, b, c);
>     })
> );
> ```
>
> 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:
>
> 1. use an explicit version of do-notation, e.g. `async do { ... }` or `do*
> { ... }`
> 2. revise the do-notation proposal to always apply Promise.resolve to the
> last expression
>
> 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)`.
>
> The idea was briefly mentioned several years ago, but didn't attract much
> attention (
> https://mail.mozilla.org/pipermail/es-discuss/2012-March/021624.html).
>
> This is an earlier draft of this proposal:
> https://github.com/edge/es-monadic
> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160207/00bf5e19/attachment.html>


More information about the es-discuss mailing list