В чем разница между Javascript "Обещания" и "Задачей" функционального программирования?

Помимо ленивого исполнения, Задачи и Обещания - это одно и то же? Когда я ссылаюсь на задачу, я ссылаюсь на класс, который в своем основном поведении выглядит следующим образом:

class Task {
  constructor(then) {
    this.then = then;
  }
  map(mapper) {
    return new Task((resolve, reject) => this.then(
      x => resolve(mapper(x)),
      reject
    ))
  }
  flatMap(mapper) {
    return new Task((resolve, reject) => this.then(
      x => mapper(x).then(resolve, reject),
      reject
    ))
  }
}

Какой тип (класс?) Является задачей / обещанием? Я изучаю подходы к функциональному программированию, но не думаю, что дошел до этого типа. Это тип монады?

1 ответ

Решение

Да, ключевым моментом является монадное связывание или flatMap в вашем случае это имеет подпись:

Task A -> A -> Task B -> Task B

С обещаниями - это then метод, который:

Promise A -> (A -> Promise B) -> Promise B
 this          onFulfilled        return value

Фактически, оба являются экземплярами Монады Продолжения. Многие другие вещи (например, потоки Rx) являются экземплярами монады продолжения.

Обещания в JavaScript, однако, имеют несколько иную (и более уродливую, по практическим соображениям) сигнатуру, при которой возможно также возвращать простое значение из thenи существует семантика исключений.

Был толчок к более "монадическим" обещаниям еще в 2013 году, когда они были выполнены, но это не удалось. Текущие обещания в JavaScript на самом деле не являются "монадой" как таковой.

A.Обещания - это еще один шаг рефакторинга дальше, чем callback. Просто так. если у вас есть функция

const f = x =>  x * x ;

1) Используйте Callback и удалите тип возврата

Вы можете передать обратный вызов и удалить тип возврата. Это знаменитый продолжение прохождения стиля

const f1 = (x,callback)=>callback(x*x);

Что делать, если мы карри действие и вернуть его в результате?! мы могли бы сделать это:

const squareCont = (x)=>callback=>callback(x*x);

если вы посмотрите на это в течение долгого времени и переименуете callback для разрешения, вы увидите, что это действительно обещание.

//i rewrited it to make it clearer
var squareCont = function(x){
   return function (resolve){return resolve (x*x);}
}

[Примечание: мы могли бы превратить это в Обещание, если бы мы вложили функцию обратного вызова в объект, который предоставляет функцию затем так:

const squarePromise = (x)=>({then:callback=>callback(x*x)});

squarePromise(2).then(r=>console.log(r))

проверьте скрипку здесь] B.Task - Coninuation Co-Monad. Поскольку я не могу суммировать это здесь, вы можете прочитать более подробно здесь: Обещания и продолжение Monad в JavaScript и здесь Async/await aka Continuation Co- Monad в JavaScript

Другие вопросы по тегам