跳到主要内容

延续与惰性求值

延续怎样表示“接下来要做什么”?​

  • 延续(Continuation): 程序在某一点之后尚未执行的部分;
  • 显式形式: 把后续步骤作为函数参数传入当前计算;
const printAsString = (num) => console.log(`Given ${num}`);
const addOneAndContinue = (num, continueWith) => continueWith(num + 1);

addOneAndContinue(2, printAsString); // Given 3

异步回调为什么是一种延续?​

  • 等待阶段: 文件尚未读取,主程序不能使用响应;
  • 恢复阶段: 数据到达后,回调接收数据并执行剩余程序;
readFileAsync("path/to/file", (error, response) => {
if (error) return handleError(error);
continueProgramWith(response);
});

惰性求值如何按需产生数据?​

  • 惰性求值: 延迟表达式,直到其值真正被需要;
  • 收益: 可描述无限序列,只消费当前需要的有限部分;
  • JavaScript 示例: 生成器在每次 next() 时才继续求值;
function* randoms() {
while (true) yield Math.random();
}

const iterator = randoms();
iterator.next(); // 此时才生成一个随机值

延续与惰性求值改变了什么?​

概念被显式表示的内容
延续当前步骤之后的控制流
惰性尚未发生的值计算
  • 共同点: 都把“未来才执行的工作”变成可传递、可控制的程序值;