Monads
by Semmel
HTML
<script src="https://rawgithub.com/douglascrockford/monad/master/monad.js"></script>
JavaScript
function inc(value) { return value + 1; }
/// Douglas Crockford
var createDCIdentity = MONAD();
var dcIdentity = createDCIdentity(5);
/// Monad
dcIdentity.bind(console.log.bind(console)); // AXIOM 1: prints 5
var incrementedValue = dcIdentity.bind(inc); // incrementedValue is 6
var incrementedDCId = createDCIdentity(incrementedValue);
incrementedDCId.bind(console.log.bind(console));
/* AXIOMS siehe Das Curry-Buch Seite 167
unit(value).mbind(f) === f(value)
monad.mbind(unit) === monad
// jQuery style
monad.mbind(f).mbind(g) ==== monad.mbind(function(value)
{
return f(value).mbind(g);
}
);
*/
/// Brian Lonsdorf
function BLIdentity(value)
{
this.value = value;
}
/// Functor
BLIdentity.prototype.fmap = function (func) {
return new BLIdentity(func(this.value));
};
var blIdentity = new BLIdentity(10);
blIdentity.fmap(console.log.bind(console)); // prints 10
var incrementedBLId = blIdentity.fmap(inc);
incrementedBLId.fmap(console.log.bind(console)); // prints 11