изменчивость в стороне;Насколько я понимаю, то, что вы написали, ближе к аппликативному функтору, чем к монаде или моноиду.
Опять же, насколько я понимаю, моноид - это группа (в абстрактном алгебраическом смысле), замкнутая в операции single , отображающей один тип в себя.Если у вас было только реализовано add
, то вы могли бы сказать , что ваша цепочка прототипов реализовала моноид.Но даже в этом случае вам придется вручную указывать сокращение в виде двоичной операции между каждым и каждым аргументом, например, так:
M({x:0}).add(1).add(2)...add(100) === 1050; // or _.reduce([1..100],add)
Но так как вы связали неопределенное количество функцийк типу (M
), который все знают, как «развернуть» этот тип, применить намеченную функцию, затем восстановить «обертку» при выходе, тогда у вас есть своего рода аппликативный функтор.
Есливы нашли способ составления областей действия всех функций, работающих на M
, тогда вы были бы еще ближе к монадической реализации:
var bigOpFromLittleOps =
M({x:0}) .bind(function(x0){
return Madd(1) .bind(function(x1){
return Madd(2) .bind(function(x2){
...
return Madd(100) .bind(function(x100){
return Mreturn(x100);
}); ... });});})() === 1050; // Overkill
Такие реализации сложны, но дают вам возможность нарезатьи нарезать их на маленькие кусочки, и / или составить более крупные из более мелких.