О, коллега и по JS, и по Хаскелю!
На самом деле контейнер, содержащий значение, это не совсем верно. Скорее правильно говорить о вычислениях в среде.
Вот тут это разбирается
https://www.ahnfelt.net/monads-forget-about-bind/
Т.е. у нас есть 3 функции, работающие со "средой":
fmap -- отображение морфизма с одной среды на другую среду
return -- погружение категории в среду.
join -- объединение или растворение категории в среде.
class Monad m where
fmap :: (a -> b) -> (m a -> m b)
join :: m (m a) -> m a
return :: a -> m a
Из этого легко собирается bind
(>>=) m f = join (fmap f m)
Где m и f -- соотвествтвующая пара функций. К примеру
getChar >>= putChar
Или, для наглядности,
(>>=) getChar putChar
Короче, работает мозголомно, но в соответствующие монады (вычислений со средой может быть множество видов) можно переписать любой императивный код.

IT-юмор
7.1K постов53.2K подписчиков
Правила сообщества
Не публикуем посты:
1) с большим количеством мата
2) с просьбами о помощи
3) не относящиеся к IT-юмору