История изменений
Исправление x3al, (текущая версия) :
- Монада — это Functor + Applicative + Monad. Точнее, можешь считать, что Monad наследуется от Applicative, а Applicative — от Functor.
- Functor — это то, что умеет fmap (можешь обозвать его map).
map берёт функцию, работающую с необёрнутыми значениями, и применяет её к тому, что внутрь него завёрнуто.
incBy6 = function(x) {return x + 6}
— это функция, работающая с необёрнутыми значениями. Чтобы применить её, нужен map (не bind).map = function(Functor, func) { return Functor.map(func) }
map(Identity(5), incBy6); // Identity(11)
- Applicative — это то, что умеет liftA (я хз, как это обозвать в жабоскрипте). liftA умеет взять завёрнутую функцию, которая работает с необёрнутыми значениями и map'нуть её к функтору.
- Monad — это то, что умеет bind. bind умеет взять функцию, возвращающую обёрнутое значение, и применить её к тому, что завёрнуто в ней.
- Для того, чтобы определить монаду, достаточно определить bind и return. return возвращает, грубо говоря, новый instance от значения, которому скормишь.
Обычно юзаешь самое минимальное из того, что тебе нужно. В монаду можно завернуть как вычисления (Maybe — самый известный пример: проверка на null внутри, но это может быть и Either), так и контейнер (List/Array/что там ещё).
Вроде как всё. Поэтому твой IIdentity.prototype.transform
определяет функтор Identity вместо монады (ибо transform — это fmap).
Исходная версия x3al, :
- Монада — это Functor + Applicative + Monad. Точнее, можешь считать, что Monad наследуется от Applicative, а Applicative — от Functor.
- Functor — это то, что умеет fmap (можешь обозвать его map).
map берёт функцию, работающую с необёрнутыми значениями, и применяет её к тому, что внутрь него завёрнуто.
incBy6 = function(x) {return x + 6}
— это функция, работающая с необёрнутыми значениями. Чтобы применить её, нужен map (не bind).map = function(Functor, func) { return Functor.map(func)
map(Identity(5), incBy6); // Identity(11)
- Applicative — это то, что умеет liftA (я хз, как это обозвать в жабоскрипте). liftA умеет взять завёрнутую функцию, которая работает с необёрнутыми значениями и map'нуть её к функтору.
- Monad — это то, что умеет bind. bind умеет взять функцию, возвращающую обёрнутое значение, и применить её к тому, что завёрнуто в ней.
- Для того, чтобы определить монаду, достаточно определить bind и return. return возвращает, грубо говоря, новый instance от значения, которому скормишь.
Обычно юзаешь самое минимальное из того, что тебе нужно. В монаду можно завернуть как вычисления (Maybe — самый известный пример: проверка на null внутри, но это может быть и Either), так и контейнер (List/Array/что там ещё).
Вроде как всё. Поэтому твой IIdentity.prototype.transform
определяет функтор Identity вместо монады (ибо transform — это fmap).