В чем разница между продолжением и обратным вызовом?
Я просматривал всю сеть в поисках просвещения о продолжениях, и это ошеломляет, как простейшие объяснения могут так сильно запутать программиста JavaScript, как я. Это особенно верно, когда большинство статей объясняют продолжения с помощью кода в Scheme или используют монады.
Теперь, когда я наконец-то понял, что понял суть продолжений, я хотел узнать, действительно ли то, что я знаю, является правдой. Если то, что я считаю правдой, на самом деле не так, то это невежество, а не просветление.
Итак, вот что я знаю:
Почти во всех языках функции явно возвращают значения (и контролируют) их вызывающей стороне. Например:
var sum = add(2, 3);
console.log(sum);
function add(x, y) {
return x + y;
}
Теперь в языке с функциями первого класса мы можем передать управляющее и возвращаемое значение обратному вызову вместо явного возврата вызывающей стороне:
add(2, 3, function (sum) {
console.log(sum);
});
function add(x, y, cont) {
cont(x + y);
}
Таким образом, вместо возврата значения из функции мы продолжаем с другой функцией. Поэтому эта функция называется продолжением первой.
Так в чем же разница между продолжением и обратным вызовом?