Монады в JavaScript
Итак, я хочу понять практические случаи, когда полезны монад в JavaScript.
Я прочитал кучу статей о Monads в JavaScript и понял, что jQuery является одним из примеров его использования. Но помимо шаблона "цепочки", какие другие проблемы могут быть эффективно решены с помощью Monads в интерфейсной технике?
Ref:
http://importantshock.wordpress.com/2009/01/18/jquery-is-a-monad/
http://igstan.ro/posts/2011-05-02-understanding-monads-with-javascript.html
Ответы
Ответ 1
Ну, я думаю, что первая статья замечательная и довольно подробная. В нем описывается множество проблем, решаемых JQuery и его монадской природой.
- JQuery обертывает элементы DOM и дает более богатый интерфейс. Решенные проблемы многочисленны: более богатые события ( "мышиные", "мышиные", "hashchnged" и т.д.). Связывание событий добавляет обработчики вместо переопределения. Интерфейс для обработки CSS аналогичен интерфейсам, открытым JQuery.
Это также причина, по которой JQuery настолько интуитивно понятен многим разработчикам, поскольку он просто обертывает то, что мы знаем, и не пытаемся изобрести HTML.
Не говоря уже о том, что он сохраняет много ошибок при обращении к нулям. Если у меня нет элемента с id guy
, то запуск $("#guy").text("I am not here")
не приведет к ошибке в JQuery.
-
JQuery легко обертывается вокруг элемента DOM, позволяя перемещаться назад и вперед между необработанным интерфейсом JS и JQuery. Это позволяет разработчикам изучать JQuery в своем собственном темпе, а не переписывать весь код за один раз.
-
Когда JQuery передает ответ с аргументами, он использует объект DOM вместо оболочки JQuery. Это позволяет третьим сторонам легко интегрироваться с JQuery, поскольку им не нужно полагаться на JQuery.
Например, скажем, я написал функцию, которая краснет красным текстом, используя необработанный JavaScript. function paintRed(element){element.style.color="red"}
- Я легко могу передать эту функцию как обратный вызов функции JQuery.
Ответ 2
Вы можете избежать использования глобальных переменных и состояния при использовании монад (например, "чистый" код). Вы также можете взглянуть на https://github.com/brownplt/flapjax/. Flapjax - функциональная библиотека реактивного программирования, которая также использует монадический подход.
Ответ 3
Передача аргументов заданной функции обратного вызова в пределах определенной области может быть обобщена с использованием монады:
/* Unit function */
function Monad(value)
{
// Construct monad and set value to given argument or undefined
this.value = value || undefined;
}
/* Constructor function */
Monad.prototype.pass = function(value, cb, scope)
{
// return constructor result if no default value is passed
if (/undefined/.test(this.value) )
{
return new this.constructor();
}
// return callback result for given value in given context if scope is passed
if(scope)
{
/* Bind function */
return cb.call(scope, value);
}
// return callback result for given value otherwise
return cb(value);
}
/* Separate arguments from function, and function from global scope */
var foo = new Monad(RegExp);
var bar = foo.pass(2, Function("count","return ++count"), Math);
Ссылки