Я пытаюсь понять концепцию монад и хочу знать, является ли этот код реализацией этой концепции (в 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