And draft ES6 tried for monadic, but compatibility with Promises libraries (more than "convenience") prevailed.
/be On Sun, Feb 7, 2016 at 11:35 AM Raphael Mu <encryptedre...@gmail.com> wrote: > In theory it's possible, but Promise.resolve automatically joins Promises > for the sake of ergonomics. > > On Sun, Feb 7, 2016 at 1:15 PM Jordan Harband <ljh...@gmail.com> wrote: > >> How is Promise an instance of Monad, if you can't ever have a Promise of >> a Promise? >> >> On Sun, Feb 7, 2016 at 9:59 AM, Raphael Mu <encryptedre...@gmail.com> >> wrote: >> >>> The `a < -b` issue could be solved by using a different operator, like >>> `</` or `<#`. >>> >>> On Sun, Feb 7, 2016 at 12:35 PM Kevin Smith <zenpars...@gmail.com> >>> wrote: >>> >>>> Why not just use await within `async do`? >>>> >>>> On 12:19PM, Sun, Feb 7, 2016 Rick Waldron <waldron.r...@gmail.com> >>>> wrote: >>>> >>>>> 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 <encryptedre...@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@mozilla.org >>>>>> https://mail.mozilla.org/listinfo/es-discuss >>>>>> >>>>> _______________________________________________ >>>>> es-discuss mailing list >>>>> es-discuss@mozilla.org >>>>> https://mail.mozilla.org/listinfo/es-discuss >>>>> >>>> >>> _______________________________________________ >>> es-discuss mailing list >>> es-discuss@mozilla.org >>> https://mail.mozilla.org/listinfo/es-discuss >>> >>> >> _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss