LINUX.ORG.RU

История изменений

Исправление 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).