Promise
a Monad?I think so.
From https://wiki.haskell.org/Monad_laws:
return a >>= f ≡ f a
m >>= return ≡ m
(m >>= f) >>= g ≡ m >>= (\x -> f x >>= g)
return
be resolve
a
be 1
m
be a Promise
of a
>>=
be then
var resolve =
function (x) {
return Promise.resolve(x);
;
}
var a = 1
var m = resolve(a);
var f =
function (x) {
return resolve(x * 6);
;
}
var g =
function (x) {
return resolve(x * 7);
; }
var equals =
function(p1, p2) {
Promise.all([p1, p2])
.then(
function (xs) {
if (xs[0] !== xs[1]) {
throw Error(xs[0] + " !== " + xs[1]);
}
};
);
}
// Left identity
equals(resolve(a).then(f), f(a));
// Right identity
equals(m.then(resolve), m);
// Associativity
equals( (m.then(f)).then(g)
, m.then(function (x) {
return f(x).then(g);
}
);
)
console.log('done')
This file is literate JavaScript, and can be run using Codedown:
$ curl https://earldouglas.com/posts/javascript/promisem.md |
codedown javascript |
node
done