Hacker News new | ask | show | jobs
by yorwba 3198 days ago
> not all monads support a coalescing operation like Promise.all.

Actually, they do. Haskell calls it sequence :: (Traversable t, Monad m) => t (m a) -> m (t a) [1]

It works by consuming the structure outside the monad and rebuilding it inside. A possible implementation specialized for lists is

  sequence [] = return []
  sequence (h:t) = do
    h' <- h
    t' <- sequence t
    return (h':t')
[1] http://hackage.haskell.org/package/base-4.10.0.0/docs/Prelud...
1 comments

Sorry, I should've been more clear. You're right - you can absolutely build sequence out of the bind operation for any monad.

Promise.all is not just sequence though, there's some additional subtleties to it. In particular the fail-fast behaviour:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refe...

That's the kind of fundamental coalescing operation that you cannot implement with bind on plain monads.