Распаковка Monad удобоваримым и практичным способом.

Что такое монада?

Проще говоря, монады похожи на классы для вычислительных паттернов. Они абстрагируют определенные шаблоны и позволяют нам писать более декларативный код. Все монады имеют два общих метода, которые в javascript обычно называются flatMap (привязка в haskell) и return. FlatMap принимает в качестве аргумента только обратный вызов, затем он распаковывает данные из монады и передает их в обратный вызов, наконец, flatMap упаковывает результат обратного вызова в новую монаду того же типа и возвращает эту новую монаду. Возврат распаковывает все, что хранится в Монаде.

Это звучит так эзотерически, где же код?

Очень распространенная монада в Haskell - это монада Maybe, которая используется для проверки нулевого значения перед работой с этими данными.

Обычный шаблон для решения этой проблемы в javascript выглядит так:

как видите, это довольно некрасиво и повторяет много кода. Чтобы исправить это, мы напишем Maybe Monad!

Идея состоит в том, чтобы упаковать уродливый шаблон, который мы использовали в императивном примере выше, в монаду, чтобы создать декларативный вычислительный поток. Мы делаем это в методе flatMap в строке 33, проверяя наличие null изнутри метода, вызывая обратный вызов с данными, хранящимися в Maybe Monad (если они не являются null или undefined!), А затем возвращая новый MaybeMonad с результат обратного вызова. Это позволяет связывать вызовы flatMap и создавать очень чистый поток в нашем коде!

Теперь применим эту монаду к тому же коду, что и в императивном примере:

теперь намного чище! Возможно, вы уже поняли, что этот шаблон очень похож на обещания; это потому, что на самом деле обещания - это монады! Они представляют собой инструмент для абстрагирования от общего шаблона и позволяют нам аккуратно объединять функции, чтобы избежать пирамиды гибели.

Конечно, о монадах нужно знать гораздо больше, и я только начинаю царапать поверхность. Надеюсь, однако, теперь Монады стали менее страшными!

дальнейшее обучение

Haskell определение монады

Отличный пример в scala

Монадная библиотека для JS

Дуглас Кроуфорд говорит о монадах