Я пытаюсь понять концепцию монадов, и я хочу знать, является ли этот код реализацией этой концепции (в 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, поэтому этот контекст внутри метода всегда является объектом 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.
Я правильно понимаю это? Является ли монада монахом?
EDIT изменен код на github https://github.com/jcubic/monadic