Это монада?

Я пытаюсь понять концепцию монад и хочу знать, является ли этот код реализацией этой концепции (в JavaScript).

У меня есть функция M, которая возвращает новый объект, который установил метод, который создает метод-оболочку

var foo = M().set('getX', function() { 
  return this.x; 
}).set('setX', function(x) { 
  this.x = x;
}).set('addX', function(x) { 
  this.x += x;
});

И затем я могу связать метод foo

foo.setX(10).addX(20).addX(30).getX()

, вернет 60

и то же самое, если у меня есть объект с методами, и вызовите M с этим объект.

var foo = {
  x: 10,
  add: function(x) {
    this.x += x;
  }
};

M(foo).add(10).add(20).add(30).x

вернет 70

Функции заключены в объект M, поэтому внутри метода this context всегда будет этот объект M.

f = M({x: 20}).set('getX', function() {
   return this.x; 
}).set('addX', function(x) {
   this.x += x;
}).addX(10).getX

поэтому f - это функция с контекстом объекта, заключенного в M - если я вызываю f () вернет 30.

Я правильно понимаю? Является ли M монадой?

EDIT измененный код находится на github https://github.com/jcubic/monadic

13
задан jcubic 3 December 2012 в 06:37
поделиться