首先,我们将表示一个Stream这样的:
a1 a2 a3 a4 a5 ...
现在,让我们来定义ruler分开:
ruler :: Stream Integer
ruler = streamInterleave (streamRepeat 0) (streamMap (+1) ruler)
在 Haskell 中,很重要的一点是懒惰。也就是说,在需要评估之前,不需要评估东西。这在这里很重要:这就是使这个无限递归定义起作用的原因。那么我们如何理解这一点呢?我们将从streamRepeat 0位开始:
0 0 0 0 0 0 0 0 0 ...
然后将其馈入 a ,它与来自(用s表示streamInterleave)的(尚未知的)流交错:streamMap (+1) rulerx
0 x 0 x 0 x 0 x 0 x 0 x ...
现在我们将开始填写那些xs。我们已经知道ruleris0的每个第二个元素,所以streamMap (+1) rulermust的每个第二个元素1:
1 x 1 x 1 x 1 x 1 x ... <--- the elements of (streamMap (+1) ruler)
0 1 0 x 0 1 0 x 0 1 0 x 0 1 0 x 0 1 0 x ... <--- the elements of ruler
现在我们知道每组四个中的第二个元素(所以数字 2,6,10,14,18,...)是1,所以对应的元素streamMap (+1) ruler必须是2:
1 2 1 x 1 2 1 x 1 2 ... <--- the elements of (streamMap (+1) ruler)
0 1 0 2 0 1 0 x 0 1 0 2 0 1 0 x 0 1 0 2 ... <--- the elements of ruler
现在我们知道,每组八中的每第四个元素(所以数字 4,12,20,...)是2这样对应的元素streamMap (+1) rulermust 是3:
1 2 1 3 1 2 1 x 1 2 ... <--- the elements of (streamMap (+1) ruler)
0 1 0 2 0 1 0 3 0 1 0 2 0 1 0 x 0 1 0 2 ... <--- the elements of ruler
我们可以ruler像这样无限n/2, 3n/2, 5n/2, ...地继续构建,将 的每个编号的值替换回去ruler。