我正在阅读SICP,并且难以理解为无限流提供的一个示例:
https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-24.html#%_sec_3.5.2
我们可以通过使用诸如add-streams之类的操作来操纵流来做更多有趣的事情,这会产生两个给定流的元素求和:62
(define (add-streams s1 s2)
(stream-map + s1 s2))
现在我们可以如下定义整数:
(define integers (cons-stream 1 (add-streams ones integers)))
我显然可以理解integers
定义背后的意图,但我正在努力在自己的脑海中“模拟”此流。先前的示例不是问题,因为状态的维护是明确的。如本例所示:
(define (integers-starting-from n)
(cons-stream n (integers-starting-from (+ n 1))))
(define integers (integers-starting-from 1))
我毫无疑问地理解了整数的定义。
本书描述了ones
的定义:
(define ones (cons-stream 1 ones))
这很像递归过程的定义:一对是其对数为1的对,其cdr是对一个对进行评估的保证。评估cdr会再次给我们一个1和一个承诺来评估它,依此类推。
也许这条线让我失望了。一个很简单,因为在每个stream-cdr
上都会评估该过程,并提供一个新的“ 1”和下一个承诺。
[当我尝试将此推理应用于integers
时,我一直在努力理解为什么结果流不是“ 1 2 2 2 2 2 ... ...”的原因,因为整数会不断被重新评估,并且实际上从1重新开始。>
我正在阅读SICP,并且难以理解为无限流提供的一个示例:https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-ZH-24.html# %_sec_3.5.2我们...
请参见foot note 56。
我在这里缺少的部分是integers
根本没有被重新评估。add-streams
返回的保证是每个输入流的stream-cdr
。先前提到的“状态”保持在反馈回路中。老实说,它的力量似乎仍然不可思议。
每次在stream-cdr
上调用integers
时,都会创建一个新的ones
系列,并将其添加到所有先前的ones
中。