延续与惰性求值
延续怎样表示“接下来要做什么”?
- 延续(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(); // 此时才生成一个随机值
延续与惰性求值改变了什么?
| 概念 | 被显式表示的内容 |
|---|---|
| 延续 | 当前步骤之后的控制流 |
| 惰性 | 尚未发生的值计算 |
- 共同点: 都把“未来才执行的工作”变成可传递、可控制的程序值;