В чем разница между 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