Распаковка Monad удобоваримым и практичным способом.
Что такое монада?
Проще говоря, монады похожи на классы для вычислительных паттернов. Они абстрагируют определенные шаблоны и позволяют нам писать более декларативный код. Все монады имеют два общих метода, которые в javascript обычно называются flatMap (привязка в haskell) и return. FlatMap принимает в качестве аргумента только обратный вызов, затем он распаковывает данные из монады и передает их в обратный вызов, наконец, flatMap упаковывает результат обратного вызова в новую монаду того же типа и возвращает эту новую монаду. Возврат распаковывает все, что хранится в Монаде.
Это звучит так эзотерически, где же код?
Очень распространенная монада в Haskell - это монада Maybe, которая используется для проверки нулевого значения перед работой с этими данными.
Обычный шаблон для решения этой проблемы в javascript выглядит так:
как видите, это довольно некрасиво и повторяет много кода. Чтобы исправить это, мы напишем Maybe Monad!
Идея состоит в том, чтобы упаковать уродливый шаблон, который мы использовали в императивном примере выше, в монаду, чтобы создать декларативный вычислительный поток. Мы делаем это в методе flatMap в строке 33, проверяя наличие null изнутри метода, вызывая обратный вызов с данными, хранящимися в Maybe Monad (если они не являются null или undefined!), А затем возвращая новый MaybeMonad с результат обратного вызова. Это позволяет связывать вызовы flatMap и создавать очень чистый поток в нашем коде!
Теперь применим эту монаду к тому же коду, что и в императивном примере:
теперь намного чище! Возможно, вы уже поняли, что этот шаблон очень похож на обещания; это потому, что на самом деле обещания - это монады! Они представляют собой инструмент для абстрагирования от общего шаблона и позволяют нам аккуратно объединять функции, чтобы избежать пирамиды гибели.
Конечно, о монадах нужно знать гораздо больше, и я только начинаю царапать поверхность. Надеюсь, однако, теперь Монады стали менее страшными!
дальнейшее обучение