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