Я изучал функциональное программирование и столкнулся с Monads, Functors и Applicatives.
По моему мнению, применяются следующие определения:
a) (A => B) => C [A] => C [B] | Функтор
b) (A => C [B]) => C [A] => C [B] | монада
c) (C [A => B]) => C [A] => C [B] | Прикладное
(ссылка: https://thedet.wordpress.com/2012/04/28/functors-monads-applicatives-can-be-so-simple/)
Кроме того, я понимаю, что Монада является частным случаем Functor. Как и в случае, она применяет функцию, которая возвращает завернутое значение в завернутое значение и возвращает завернутое значение.
Когда мы используем Promise.then(func)
, мы передаем Promise (т.е. C [A]) функцию, которая обычно имеет сигнатуру A => B
и возвращает другое Promise (т.е. C [B]). Поэтому я думал, что Promise будет только Functor, а не Monad, поскольку func
возвращает B, а не C [B].
Однако, по поиску в Google, я узнал, что Promise - это не только Functor, но и Monad. Интересно, почему, поскольку func
не возвращает завернутое значение C [B], а просто B. Что мне не хватает?